Script 1 for Kitchel et al.Ā 2023 in prep taxonomic diversity manuscript.

library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ───────────────────────────────────────────────── tidyverse 1.3.2 ā”€ā”€āœ” tibble  3.1.8      āœ” purrr   0.3.5 
āœ” tidyr   1.2.1      āœ” dplyr   1.0.10
āœ” readr   2.1.3      āœ” forcats 0.5.2 ── Conflicts ──────────────────────────────────────────────────── tidyverse_conflicts() ──
āœ– dplyr::between()   masks data.table::between()
āœ– dplyr::collapse()  masks nlme::collapse()
āœ– tidyr::expand()    masks Matrix::expand()
āœ– dplyr::filter()    masks stats::filter()
āœ– dplyr::first()     masks data.table::first()
āœ– dplyr::lag()       masks stats::lag()
āœ– dplyr::last()      masks data.table::last()
āœ– tidyr::pack()      masks Matrix::pack()
āœ– purrr::transpose() masks data.table::transpose()
āœ– tidyr::unpack()    masks Matrix::unpack()
library(sp)
library(raster)

Attaching package: ā€˜raster’

The following object is masked from ā€˜package:dplyr’:

    select

The following object is masked from ā€˜package:lme4’:

    getData

The following object is masked from ā€˜package:nlme’:

    getData
library(rgeos)
rgeos version: 0.5-9, (SVN revision 684)
 GEOS runtime version: 3.10.2-CAPI-1.16.0 
 Please note that rgeos will be retired by the end of 2023,
plan transition to sf functions using GEOS at your earliest convenience.
 GEOS using OverlayNG
 Linking to sp version: 1.4-7 
 Polygon checking: TRUE 
library(rgbif)
library(viridis)
Loading required package: viridisLite
library(gridExtra)

Attaching package: ā€˜gridExtra’

The following object is masked from ā€˜package:dplyr’:

    combine
library(rasterVis)
library(concaveman)
library(sf)
library(viridis)
library(cowplot)
library(data.table)
set.seed(1)

Pull in compiled and cleaned data from FishGlob, downloaded on November 28, 2022 (V 1.5). This is typically compiled by Dr.Ā Aurore Maureaud. This includes public and private data, and therefore link cannot be shared. However, with editing, you can run analyses for public trawl surveys.


FishGlob_1.5 <- fread(here::here("data","FISHGLOB_v1.5_clean.csv"))
|--------------------------------------------------|
|==================================================|
|--------------------------------------------------|
|==================================================|

This version of FishGlob leaves out seasons for GMEX, fix here

#add season to GMEX to survey unit

FishGlob_1.5[survey == "GMEX", survey_unit := paste0(survey,"-",season)]

Also adding in seasons for NIGFS

#add season to GMEX to survey unit

FishGlob_1.5[survey == "NIGFS", survey_unit := paste0(survey,"-",quarter)]

Also add seasons for Nor-BTS

FishGlob_1.5[survey == "Nor-BTS" & month %in% c(1:6), survey_unit := "Nor-BTS-1"][survey == "Nor-BTS" & month %in% c(7:12), survey_unit := "Nor-BTS-3"]

ZAF (South Africa) has distinct Atlantic and Indian surveys (split at ~20.01˚ E, Cape Agulhas)

FishGlob_1.5[survey == "ZAF" & longitude <20.01, survey_unit := "ZAF-ATL"][survey == "ZAF" & longitude >= 20.01, survey_unit := "ZAF-IND"]

Region names

sort(unique(FishGlob_1.5[,survey_unit]))
 [1] "AI"          "BITS-1"      "BITS-4"      "CHL"         "COL"         "DFO-HS"     
 [7] "DFO-NF"      "DFO-QCS"     "DFO-SOG"     "DFO-WCHG"    "DFO-WCVI"    "EBS"        
[13] "EVHOE"       "FALK"        "FR-CGFS"     "GIN"         "GMEX-Fall"   "GMEX-Summer"
[19] "GOA"         "GRL-DE"      "GSL-N"       "GSL-S"       "ICE-GFS"     "IE-IGFS"    
[25] "IS-MOAG"     "IS-TAU"      "MEDITS"      "MRT"         "NAM"         "NEUS-Fall"  
[31] "NEUS-Spring" "NIGFS-1"     "NIGFS-4"     "Nor-BTS-1"   "Nor-BTS-3"   "NS-IBTS-1"  
[37] "NS-IBTS-3"   "NZ-CHAT"     "NZ-ECSI"     "NZ-SUBA"     "NZ-WCSI"     "PT-IBTS"    
[43] "ROCKALL"     "S-GEORG"     "SCS-FALL"    "SCS-SPRING"  "SCS-SUMMER"  "SEUS-fall"  
[49] "SEUS-spring" "SEUS-summer" "SWC-IBTS-1"  "SWC-IBTS-4"  "WBLS"        "WCANN"      
[55] "WCTRI"       "ZAF"         "ZAF-ATL"     "ZAF-IND"    

##Data Replacements ####Greenland (version in FishGlob 1.5 is missing lengths and therefore biomass values) This version was obtained directly from Karl-Michael Werner karl-michael.werner@thuenen.de who now manages the Greenland survey September 2023. He is based in Germany.

greenland <- 

####Norway Prepped by Laurene Pecuchet (U Trƶmso, Norway) September 2023 to replace what’s in FishGlob 1.5 because IMR ā€œare quite concerned that FishGlob, and other studies, have been using aā€flawedā€ multi-surveys dataset that is available in NMDC (data portal of IMR). Turns out that this dataset was put publicly by miscommunication on NMDC after one published paper in Scientific Reports, and I think they only realized the existence of this dataset just the last year as some papers are coming out using it (especially the one from Cesc Gordo-Vilaseca in PNAS https://www.pnas.org/doi/10.1073/pnas.2120869120). They are now trying to make some damage controls to make sure that this dataset is not used ever again in the future, but that cleanded and standardised datasets of the Barents Sea survey that are publicly available in NMDC are used instead of.

September 14: From Laurene, ā€œI send you in attachment the ā€œnewā€ IMR survey formatted for Fishglob. I have done some small check of the dataset, and so far everything looks good, but I didn’t do a deep check yet, but I don’t see why there should be any problems with it….For your study, I think it is also important that you know that there has been some inconsistencies in taxonomic descriptions in the Barents Sea so that some species should be considered at the genus level instead of for biodiversity analysis, I send you in attach an excel (Barents Sea Fish Reference List.csv) file that summarize which species might be a misidentification and which one should be considered and merged.ā€ All of these files now live in ā€œdata/Norway_Sep2023ā€

Given Barents Sea Fish Reference List.csv, there are some rare species that should only be trusted as a true ID if there are particular people on the boat. For consistency, these species will be removed. Despite the following information, these species will be maintained. -Current disagreement about whether Lycodes rossi and Lycodes reticulatus are different or same, will keep separate for now. -Specimens of Anarhichas less than 10cm are often misidentified, but we will still keep three distinct species

#to fix naming, link species names in data to species names in barents sea spp fix
norway_clean_spp <- unique(norway_clean[,.(accepted_name, verbatim_name)])
Error in h(simpleError(msg, call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'unique': could not find function "."

Delete Greenland and Norway

FishGlob_1.5 <- FishGlob_1.5[!(survey %in% c("Nor-BTS", "GRL-DE"))]

Add in updated Greenland and Norway data

FishGlob_1.5 <-rbind(FishGlob_1.5,norway)
FishGlob_1.5 <-rbind(FishGlob_1.5,greenland)

##Preliminary Data Cuts ###Specific Regional Changes Before Cutting to 10 years only

GSL - North: we have data 1980-2019, but gear changes in 2004/2005, so let’s use later portion (more consistent months of sampling; 2005-2019; 15 years) - South: we have data 1970-2019, but gear/vessel changes in 1985 and again in 1992, so again let’s use later portion (1992-2019; 27 years) - See this github issue

#identify haul_ids of hauls we should remove from GSL surveys
haul_ids_to_remove_GSL <- unique(FishGlob_1.5[(survey == "GSL-N" & year < 2005)|(survey == "GSL-S" & year < 1992),haul_id])

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_GSL),] #remove hauls before consistent gear/vessel was used

Nor-BTS
- Overlap between IBTS and Nor-BTS surveys below 62˚latitude, so delete all hauls that occur below 62˚latitude

#identify haul_ids of hauls we should remove from Nor-BTS surveys
haul_ids_to_remove_Nor_BTS <- unique(FishGlob_1.5[(survey == "Nor-BTS" & latitude  < 62),haul_id])

FishGlob_1.5 <- FishGlob_1.5[!(haul_id %in% haul_ids_to_remove_Nor_BTS),] #remove hauls before consistent gear/vessel was used

SGEORG - From Martin Collins, ā€œMost surveys were focussed on demersal fish on the South Georgia shelf (< 350 m), but surveys in 2003, 2010 and 2019 had some deeper trawls. The deeper trawls caught very different fish, so are unlikely to be of use to a long-term analysis, but I have left them in.ā€

-Delete all trawls below 350 M

###Because time is an essential component of these analyses, we will get rid of any survey x season combinations that are not sampled for at least 10 years

#new row for total number of years sampled
FishGlob_1.5[,years_sampled := length(unique(year)),.(survey_unit)]

summary(FishGlob_1.5$years_sampled) #ranges from 2 (DFO Straight of Georgia) to 57 (Northeast US)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   24.00   30.00   30.98   37.00   57.00 
#statistics about full dataset
nrow(FishGlob_1.5) 
[1] 4351504
length(unique(FishGlob_1.5[,survey])) 
[1] 45
length(unique(FishGlob_1.5[,survey_unit])) 
[1] 58
#remove observations for any regions x season combinations sampled less than 10 times
FishGlob.10year <- FishGlob_1.5[years_sampled >= 10,]

#statistics about reduced 10 year dataset
nrow(FishGlob.10year) 
[1] 4267620
length(unique(FishGlob.10year[,survey])) 
[1] 38
length(unique(FishGlob.10year[,as.character(survey_unit)])) 
[1] 49
#remove full database
rm(FishGlob_1.5)

###For taxonomic analyses, resolution to species is required. Therefore, we will exclude any observations not resolved to species.

FishGlob.10year.spp <- FishGlob.10year[rank %in% c("Species", "Subspecies"),] #4077730 total observations

#remove full species database
rm(FishGlob.10year)

#vector with all survey names
all_survey_units <- sort(unique(FishGlob.10year.spp[,survey_unit]))

#calculate # species per year
FishGlob.10year.spp_survey_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, accepted_name)])

FishGlob.10year.spp_survey_year[,spp_count_survey_year := uniqueN(accepted_name),.(survey_unit, year)]

FishGlob.10year.spp_survey_year.r <-unique(FishGlob.10year.spp_survey_year[,.(survey_unit,  year, spp_count_survey_year)])

nrow(FishGlob.10year.spp_survey_year.r)
[1] 1257
#calculate # hauls per year
FishGlob.10year.spp_haulid_year <- unique(FishGlob.10year.spp[,.(survey_unit, year, haul_id)])

FishGlob.10year.spp_haulid_year[,haulid_count_survey_year := uniqueN(haul_id),.(survey_unit, year)]

FishGlob.10year.spp_haulid_year.r <-unique(FishGlob.10year.spp_haulid_year[,.(survey_unit,  year, haulid_count_survey_year)])

nrow(FishGlob.10year.spp_haulid_year.r)
[1] 1257

##Visually Inspect Distribution of Data Through Time and Space

##Spatial and Temporal Patterns in All Trawl Surveys

Let’s look at the number of hauls per year/month and year/quarter and year/season visually

#unique survey, survey_unit, year, month, quarter, season, haul_id, lat, lon
FishGlob.10year.uniquehauls <- unique(FishGlob.10year.spp[,.(survey, survey_unit, year,month,quarter,season,haul_id, latitude, longitude,haul_dur)])

#add column with adjusted longitude for few surveys that cross dateline (NZ-CHAT and AI)
FishGlob.10year.uniquehauls[,longitude_adj := ifelse((survey_unit %in% c("AI","NZ-CHAT") & longitude > 0),longitude-360,longitude)]

FishGlob.10year.uniquehauls[,haul_counts_per_survey_season_month :=uniqueN(haul_id),.(survey, month, season)][, #count # hauls per survey, season, and month
                     haul_counts_per_survey_quarter_month :=uniqueN(haul_id),.(survey, month, quarter)][,#count # hauls per survey, month, and quarter
                     total_hauls_survey :=uniqueN(haul_id),.(survey)][,#count # hauls per survey in all years
                                                        
              #proportion of hauls for each survey, season, and month divided by total # over all years
                     haul_proportion_survey_season :=haul_counts_per_survey_season_month/total_hauls_survey][,
              #proportion of hauls for each survey, quarter, and month divided by total # over all years
                     haul_proportion_survey_quarter :=haul_counts_per_survey_quarter_month/total_hauls_survey][,
                                                                                                               
                     haul_count_per_survey_year_month :=uniqueN(haul_id),.(year, survey_unit, month)][, #count # hauls per survey unit, year, and month
                     total_hauls_survey_year := uniqueN(haul_id),.(survey_unit,year)][, #count total # hauls per survey unit and year
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_month_yearly := haul_count_per_survey_year_month/total_hauls_survey_year][, 

                     haul_count_per_survey_year_quarter :=uniqueN(haul_id),.(year, survey_unit, quarter)][, #count # hauls per survey unit, year, and month
                     #proportion of hauls for each survey unit and month divided by total # hauls within a survey unit within a year
                     haul_proportion_quarter_yearly := haul_count_per_survey_year_quarter/total_hauls_survey_year] 

FishGlob.10year.uniquehauls.season <- unique(FishGlob.10year.uniquehauls[,.(survey, survey_unit, month, season, haul_counts_per_survey_season_month,total_hauls_survey, haul_proportion_survey_season)]) #relative sampling by season across all years

FishGlob.10year.uniquehauls.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey,survey_unit , month, quarter, haul_counts_per_survey_quarter_month,total_hauls_survey, haul_proportion_survey_quarter)]) #relative sampling by quarter across all years

FishGlob.10year.uniquehauls.annual.month <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, month, haul_count_per_survey_year_month,total_hauls_survey_year,haul_proportion_month_yearly)]) #relative sampling by month within years

FishGlob.10year.uniquehauls.annual.quarter <- unique(FishGlob.10year.uniquehauls[,.(survey, year, survey_unit, quarter, haul_count_per_survey_year_quarter,total_hauls_survey_year,haul_proportion_quarter_yearly)]) #relative sampling by month within years

#how does #hauls vary with season and month?
survey_season_month_hauls <- ggplot(FishGlob.10year.uniquehauls.season) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_season_month_hauls, filename = "survey_season_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with quarter and month?
survey_quarter_month_hauls <- ggplot(FishGlob.10year.uniquehauls.quarter) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  facet_wrap(~survey,scales = "free_y") +
  theme_classic()

ggsave(survey_quarter_month_hauls, filename = "survey_quarter_month_hauls.pdf",path = here::here("figures","view_data"), height = 5, width = 15, units = "in")

#how does #hauls vary with year and month?
year_survey_month_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.month) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_month_hauls, filename = "year_survey_month_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

#how does #hauls vary with year and month?
year_survey_quarter_hauls <- ggplot(FishGlob.10year.uniquehauls.annual.quarter) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  facet_wrap(~survey_unit,scales = "free_y") +
  theme_classic()

ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")
ggsave(year_survey_quarter_hauls, filename = "year_survey_quarter_hauls.pdf",path = here::here("figures","view_data"), height = 8, width = 16, units = "in")

Now, let’s look at how location of sampling varies by month of sampling and year of sampling

location_by_year <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic()

ggsave(location_by_year, filename = "location_by_year.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_year, filename = "location_by_year.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")
location_by_month <- ggplot(FishGlob.10year.uniquehauls) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  facet_wrap(~survey_unit, scales = "free") +
  theme_classic()

ggsave(location_by_month, filename = "location_by_month.pdf",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.jpg",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

ggsave(location_by_month, filename = "location_by_month.eps",path = here::here("figures","view_data"), height = 8, width = 12, units = "in")

##Region Specific Data Processing

-Fredston et al.Ā 2022 and Batt et al.Ā 2017 informed North American data processing -Personal communication with Aurore Maureaud re: work by L. Pecuchet and R. Frelat and the supplementary material for Maureaud et al.Ā 2019 informed European data processing -Additional data processing informed by data itself, and by FishGlob pdf summary documents -limit to max 3 months for each survey unit, representative of a ā€˜season’

####ā€œAIā€

ggplot(FishGlob.10year.uniquehauls.season[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey == "AI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey == "AI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey == "AI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "AI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "AI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

ai_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "AI" & month %in% c(6:8),haul_id])

####BITS (We have two surveys for BITS, quarter 1 and quarter 4) BITS 1

From Fredston et al.Ā 2023, every year after 2000 has >400 hauls and most of the earlier years are <50

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep both months (2,3) -Seemingly consistent spatial distribution through time -Consistent # of species and # hauls after 2000

bits1_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-1" & month %in% c(2,3) & year > 2000,haul_id])

BITS4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "BITS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "BITS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "BITS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "BITS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Start in 2000 (starts in 1996, but gap in 1997 and 1998, and 1996 all in December; also spp richness in first survey very low; consistent # of hauls after 2000) -Seemingly consistent spatial distribution through time

bits4_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "BITS-4" & month %in% c(10:12) & year > 2000,haul_id])

####CHL (Chile)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "CHL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "CHL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "CHL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "CHL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8,9) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in # hauls through time

chl_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "CHL" & month %in% c(7:9),haul_id])

####DFO-NF

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-NF",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-NF",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-NF",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -No major changes in spp richness through time -No major changes in haulid through time

dfo_nf_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-NF" & month %in% c(10:12),haul_id])

####DFO-QCS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "DFO-QCS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "DFO-QCS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (7,8) -Seemingly consistent spatial distribution through time -No major changes in richness over time -No major changes in #hauls

dfo_qcs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "DFO-QCS" & month %in% c(7,8),haul_id])

####EBS

-Sampling years prior to 1984 (data begin in 1982) were excluded from analysis due to large apparent increases in the number of species recorded in the first two years. (Batt et al.Ā 2017)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EBS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EBS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EBS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EBS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (6,7,8) -Seemingly consistent spatial distribution through time -Per Batt et al.Ā 2017, limit to >= 1984 -No clear changes in richness through time -No clear changes in # hauls through time

ebs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EBS" & month %in% c(6,7,8) & year >= 1984,haul_id])

####EVHOE

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "EVHOE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "EVHOE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "EVHOE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "EVHOE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep (10,11,12) -Seemingly consistent spatial distribution through time -Very low sampling in 2017 (and also low richness), exclude this year

evhoe_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "EVHOE" & month %in% c(10,11,12) & year != 2017 ,haul_id])

####FALK (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FALK",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FALK",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FALK",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FALK",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep February (2) only from 2004 onward (most consistent sampling) -Inconsistent spatial distribution through time, but this will be fixed in next step with spatial standardization

falk_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FALK" & month %in% c(2) & year >= 2004, haul_id])

####FR-CGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "FR-CGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "FR-CGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

fr_cgfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "FR-CGFS" & month %in% c(9,10,11), haul_id])

####GIN (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GIN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GIN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GIN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GIN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Exclude this region, no consistent sampling through time

gin_hauls_keep <- NULL

####GMEX -In the Gulf of Mexico, we restricted our analysis to data from 1984 - 2000 (full range 1982-2014); if all years had been used, the number of sites sampled in at least 85% of years would drop from 39 to 13. (Batt et al.Ā 2017)

GMEX Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 -Inconsistent spatial distribution through time, will restrict to <-87.5 longitude -Seemingly consistent richness through time -Seeemingly consistent #hauls through time

gmex_fall_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Fall" & month %in% c(9,10,11) & longitude_adj < -87.5, haul_id])

GMEX Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GMEX-Summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GMEX-Summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 5,6,7 -In consistent spatial distribution through time, but this will be fixed in spatial standardization step -Seemingly consistent richness before 2008 and 2008 onward through time -Seeemingly consistent #hauls through time -Jump from 2007 to 2008, when spatial footprint increases, so I will only use data from before 2008

gmex_summer_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GMEX-Summer" & month %in% c(5,6,7) & year <2008, haul_id])

####GOA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GOA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GOA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GOA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GOA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep months 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent #hauls through time

goa_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GOA" & month %in% c(6,7,8), haul_id])

####GRL-DE -From Beukhof et al.Ā 2019, all surveys in October and November

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GRL-DE",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GRL-DE",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GRL-DE",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-No months in data set, but according to Beukhof et al.Ā 2019, all sampling in October and November so keep all -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls drops between 1991 and 1992, and both 1992 and 2017 so limit to years between (1993-2016)

grl_de_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GRL-DE" & year %in% c(1993:2016), haul_id])

####GSL

GSL-N

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-N",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-N",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-N",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-N",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 6,7,8 -Consistent spatial distribution through time -Seemingly consistent richness -# of hauls in 2005 is higher, so start in 2006

gsl_n_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-N" & year > 2005, haul_id])

GSL-S

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "GSL-S",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "GSL-S",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "GSL-S",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "GSL-S",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 8,9,10 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

gsl_s_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "GSL-S" & month %in% c(8:10), haul_id])

####ICE-GFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ICE-GFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ICE-GFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

ice_gfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ICE-GFS" & month %in% c(2:4), haul_id])

####IE-IGFS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IE-IGFS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IE-IGFS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11,12 -Consistent spatial distribution through time after 2004 (sampled far east in 2003 and 2004) -Seemingly consistent richness -Seemingly consistent number of hauls

ie_igfs_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "IE-IGFS" & month %in% c(10:12) & year  > 2004, haul_id])

####IS-MOAG (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "IS-MOAG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "IS-MOAG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "IS-MOAG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling too scattered over time, excluding

is_moag_hauls_keep <- NULL

####MEDITS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MEDITS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MEDITS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MEDITS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MEDITS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep all surveys in quarter 2 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

medits_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "MEDITS", haul_id])

####MRT (excluded from final dataset)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "MRT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "MRT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "MRT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "MRT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Sampling inconsistent, exclude completely

mrt_hauls_keep <- NULL

####NAM

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NAM",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NAM",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NAM",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NAM",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep surveys in 1 and 2 (most consistently sampled) -Consistent spatial distribution through time -Seemingly consistent richness except for 1998 (exclude) -Seemingly consistent number of hauls except for 1998 (exclude)

nam_hauls_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NAM" & month %in% c(1,2) & year != 1998, haul_id])

####NEUS

NEUS Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 3,4,5 months -Inconsistent spatial distribution through time, but should be caught in standardization step below -Seemingly consistent richness (especially after 87, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 81, should be fixed with standardization step)

#calculate wgt_cpue (km^2 avg from sean Lucey) and wgt_h (all biomass values calibrated to standard pre 2009 30 minute tow)
FishGlob.10year.spp[survey == "NEUS", wgt_h := wgt/0.5][survey == "NEUS", wgt_cpue := wgt/0.0384][survey == "NEUS", num_h := num/0.5][survey == "NEUS", num_cpue := num/0.0384]


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_spring_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Spring" & month %in% c(3:5) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Spring" & month %in% c(3:5) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

NEUS Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NEUS-Fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NEUS-Fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NEUS-Fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 9,10,11 months -Inconsistent spatial distribution through time, but should be caught in standardization step below -Seemingly consistent richness (especially after 84, should be fixed with standardization step) -Seemingly consistent number of hauls (especially after 85, should be fixed with standardization step)


#also, for northeast, we are going to delete any hauls before 2009 that are outside of +/- 5 minutes of 30 minutes and 2009 forward that are outside of +/- 5 minutes of 20 minutes
neus_fall_keep <- unique(FishGlob.10year.uniquehauls[((survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year < 2009 & (haul_dur > 0.42 & haul_dur < 0.58)) |
                                                        (survey_unit == "NEUS-Fall" & month %in% c(9,10,11) & year >= 2009 & (haul_dur > 0.25  & haul_dur < 0.42))), haul_id])

####NIGFS Northern Ireland

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 2,3,4 months -Inconsistent spatial distribution through time, but should be caught in standardization step below -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-1" & month %in% c(2,3,4), haul_id])

Spring Northern Ireland (quarter 1)

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NIGFS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NIGFS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Keep 10,11 months -Consistent spatial distribution through time, but should be caught in standardization step below -Seemingly consistent richness -Seemingly consistent number of hauls

nigfs_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NIGFS-4" & month %in% c(10,11), haul_id])

####Nor-BTS

First half of year (1:6), Excluded from final dataset Nor-BTS-1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "Nor-BTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "Nor-BTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "Nor-BTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "Nor-BTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-1"&month,]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-1"&month,]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "Nor-BTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "Nor-BTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use 1:3 months -Somewhat inconsistent spatial distribution through time (northern sites sampled later), but should be caught in standardization step below -Laurene Pecuchet (U Tromso) told us that only surveys 2004 and onwards work for biodiversity analyses -From 2004, consistent number of hauls except for 2013 which we will exclude

nor_bts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-1" & month %in% c(1:3) & year >= 2004 & year != 2013, haul_id])

Second half of year (2:12) Nor-BTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "Nor-BTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "Nor-BTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9,10 -Somewhat inconsistent spatial distribution through time, but should be caught in standardization step below -Number of hauls is variable, but no clear years to exclude -Laurene Pecuchet (U Tromso) told us that only surveys 2004 and onwards work for biodiversity analyses

nor_bts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "Nor-BTS-3" & month %in% c(8:10) & year >= 2000, haul_id])

####NS-IBTS

NS-IBTS-1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Consistent spatial distribution through time -Linear increase in richness, cutoff on # hauls more clear -Linear increase, but somewhat clear break between late 70s and mid-80s, only keep hauls after 1984

ns_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-1" & month %in% c(1:3) & year >= 1984, haul_id])

NS-IBTS-3

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NS-IBTS-3",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NS-IBTS-3",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8,9 -Consistent spatial distribution through time -Consistent richness through time -Early years lower # hauls, will start at 1998

ns_ibts_3_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NS-IBTS-3" & month %in% c(7:9) & year >= 1998, haul_id])

####NZ

NZ-CHAT

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-CHAT",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-CHAT",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 12,1,2 (NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO LUMP 1 and 2 with previous year) -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls after 1995

nz_chat_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-CHAT" & month %in% c(12,1,2) & year >= 1995, haul_id])

NZ-ECSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-ECSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-ECSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls -Gap between 1995 and 2005, but we have 10 total years so we’ll keep for now

nz_ecsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-ECSI" & month %in% c(4,5,6), haul_id])

NZ-SUBA

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-SUBA",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-SUBA",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 11 and 12 -Consistent spatial distribution through time -Seemingly consistent richness -Far more hauls in 1990s, these early sampling years will be excluded (start in 2000)

nz_suba_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-SUBA" & month %in% c(11,12) & year >= 2000, haul_id])

NZ-WCSI

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "NZ-WCSI",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "NZ-WCSI",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 3,4 -Consistent spatial distribution through time -Seemingly consistent richness -Linear decrease in # of hauls through time, leave out first two years with highest # hauls (>= 1995)

nz_wcsi_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "NZ-WCSI" & month %in% c(3,4) & year >= 1995, haul_id])

####PT-IBTS PT-IBTS

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "PT-IBTS",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "PT-IBTS",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

pt_ibts_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "PT-IBTS" & month %in% c(9,10,11), haul_id])

####ROCKALL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ROCKALL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ROCKALL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ROCKALL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 8,9 -Consistent spatial distribution through time -Seemingly consistent richness -Seemingly consistent number of hauls

rockall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ROCKALL" & month %in% c(8,9), haul_id])

####S-GEORG

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "S-GEORG",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "S-GEORG",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "S-GEORG",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1 and 2 -Consistent spatial distribution through time -Seemingly consistent richness except for 2003, will be excluded -Seemingly consistent number of hauls, except for 2012, will be excluded

s_georg_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "S-GEORG" & month %in% c(1,2) & !(year %in% c(2003,2012)), haul_id])

####SCS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SPRING",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SPRING",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 2,3,4 -Inconsistent spatial distribution through time (northern latitudes only sampled in early years), only include longitudes < -62 and latitudes < 45.5 -Seemingly consistent richness -Number of hauls is variable, exclude super low and high numbers (1985,1994,2015,2019)

scs_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SPRING" & month %in% c(2,3,4) & !(year %in% c(1985,1994,2015,2019)) & longitude_adj < -62 & latitude < 45.5, haul_id])

SUMMER

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SCS-SUMMER",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SCS-SUMMER",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 6,7,8 -Consistent spatial distribution through time -Richness increases linearly, not a clear break point, using breakpoint from # of hauls, but will exclude 2010 which has a very high richness -# Hauls increases linearly from ~120 in 1970 to ~220 in 2020, not a clear breakpoint, but will go with 1986 because there is a jump between 85 and 86 -Gear change in 1983 (Ellingsen et al.Ā 2015)

scs_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SCS-SUMMER" & month %in% c(6,7,8) & year >= 1986 & year != 2010, haul_id])

###SEUS

Spring

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-spring",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-spring",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 4,5,6 -Consistent spatial distribution through time -Consistent richness through time -# Hauls low in 1989 and 2018, will exclude

seus_spring_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-spring" & month %in% c(4,5,6) & year != 1989 & year != 2018, haul_id])

Summer

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-summer",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-summer",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 7,8 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_summer_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-summer" & month %in% c(7,8) & year != 1989, haul_id])

Fall

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SEUS-fall",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SEUS-fall",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 9,10,11 -Consistent spatial distribution through time -Richness consistent through time -# Hauls low in first year, otherwise okay, just exclude first year (1989)

seus_fall_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SEUS-fall" & month %in% c(9,10,11) & year != 1989, haul_id])

####SWC-IBTS

Scotland Shelf Sea

SWC-IBTS 1

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-1",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-1",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 1,2,3 -Somewhat inconsistent spatial distribution through time, but this should be addressed in spatial standardization procedure -Richness consistent through time -# Hauls consistent except low in 1995, just exclude 1995

swc_ibts_1_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-1" & month %in% c(1,2,3) & year != 1995, haul_id])

SWC-IBTS 4

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "SWC-IBTS-4",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "SWC-IBTS-4",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Use months 10,11,12 -Somewhat inconsistent spatial distribution through time (southern latitudes only sampled in early years), but this should be addressed in spatial standardization procedure -Richness consistent through time (especially after mid 90s) -# Hauls consistent except low before 1995 and low in 2013, exclude these

swc_ibts_4_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "SWC-IBTS-4" & month %in% c(10,11,12) & year != 1995 & year >= 1995, haul_id])

####WCANN

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "WCANN",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "WCANN",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "WCANN",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "WCANN",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Here, one exception, will use four months (6,7,8,9) because all sampled consistently, and lower latitude areas sampled later in the summer consistently -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time

wcann_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "WCANN" & month %in% c(6:9), haul_id])

####WCTRI -Exclude because only 10 years and overlaps somewhat wiith WCANN

wctri_keep <- NULL

####ZAF

ATL

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-ATL",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-ATL",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 1,2,3 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent through time after 1991

zaf_atl_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-ATL" & month %in% c(1:3) & year >= 1991, haul_id])

IND

ggplot(FishGlob.10year.uniquehauls.season[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(season), fill = haul_proportion_survey_season),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Season",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = factor(month), y = factor(quarter), fill = haul_proportion_survey_quarter),color = "white") +
  scale_fill_viridis() +
  labs(x = "Month", y = "Quarter",fill = "Proportion of All Survey Hauls in FishGlob") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.month[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(month), fill = haul_proportion_month_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Month",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls.annual.quarter[survey_unit == "ZAF-IND",]) +
  geom_tile(aes(x = year, y = factor(quarter), fill = haul_proportion_quarter_yearly),color = "white") +
  scale_fill_viridis() +
  labs(x = "Year", y = "Quarter",fill = "Proportion of Annual Hauls") +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = year), size = 0.3, alpha = 0.5) +
  scale_color_viridis() +
  theme_classic()


ggplot(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND",]) +
  geom_point(aes(x = longitude_adj, y = latitude, color = month), size = 0.3, alpha = 0.5) +
  scale_color_viridis(option = "plasma") +
  theme_classic()


# # of species per year??
ggplot(data = FishGlob.10year.spp_survey_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=spp_count_survey_year)) +
  geom_col() +
  theme_classic()


# # of hauls per year
ggplot(data = FishGlob.10year.spp_haulid_year.r[survey_unit == "ZAF-IND",], aes(x = year, y=haulid_count_survey_year)) +
  geom_col() +
  theme_classic()

-Include 4,5,6 -Consistent spatial distribution through time -Richness consistent through time -# Hauls consistent before 2001, and then also in 2005 and 2009-2010

zaf_ind_keep <- unique(FishGlob.10year.uniquehauls[survey_unit == "ZAF-IND" & month %in% c(4:6) & year %in% c(1985:2001,2005, 2009,2010), haul_id])

####Combine all lists that have _keep

#all objects with _keep
list_obj <- ls(pattern = "_keep")

#combine
fishglob_haulids_to_keep <- unlist(lapply(list_obj, get)) #243539 hauls (Started with 296799)

FishGlob.10year.spp_manualclean <- FishGlob.10year.spp[haul_id %in% fishglob_haulids_to_keep,]

#save
saveRDS(FishGlob.10year.spp_manualclean, file = here::here("data","cleaned","FishGlob.10year.spp_manualclean.rds"))

####Some surveys sample through end of year, fix these -NOTE THAT THIS NZ-CHAT SURVEY CROSSES YEAR, SO LUMP 1 and 2 with previous year

LS0tCnRpdGxlOiAiUHJlcGFyZSBGaXNoR2xvYiBEYXRhc2V0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBab8OrIEouIEtpdGNoZWwKZGF0ZTogT2N0b2JlciAxMSwgMjAyMwotLS0KClNjcmlwdCAxIGZvciBLaXRjaGVsIGV0IGFsLiAyMDIzIGluIHByZXAgdGF4b25vbWljIGRpdmVyc2l0eSBtYW51c2NyaXB0LgoKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzcCkKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkocmdiaWYpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkocmFzdGVyVmlzKQpsaWJyYXJ5KGNvbmNhdmVtYW4pCmxpYnJhcnkoc2YpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGRhdGEudGFibGUpCnNldC5zZWVkKDEpCgpgYGAKClB1bGwgaW4gY29tcGlsZWQgYW5kIGNsZWFuZWQgZGF0YSBmcm9tIEZpc2hHbG9iLCBkb3dubG9hZGVkIG9uIE5vdmVtYmVyIDI4LCAyMDIyIChWIDEuNSkuIFRoaXMgaXMgdHlwaWNhbGx5IGNvbXBpbGVkIGJ5IERyLiBBdXJvcmUgTWF1cmVhdWQuIFRoaXMgaW5jbHVkZXMgcHVibGljIGFuZCBwcml2YXRlIGRhdGEsIGFuZCB0aGVyZWZvcmUgbGluayBjYW5ub3QgYmUgc2hhcmVkLiBIb3dldmVyLCB3aXRoIGVkaXRpbmcsIHlvdSBjYW4gcnVuIGFuYWx5c2VzIGZvciBwdWJsaWMgdHJhd2wgc3VydmV5cy4KCgpgYGB7ciBwdWxsIGluIGZpc2hnbG9iIGRhdGFiYXNlfQoKRmlzaEdsb2JfMS41IDwtIGZyZWFkKGhlcmU6OmhlcmUoImRhdGEiLCJGSVNIR0xPQl92MS41X2NsZWFuLmNzdiIpKQoKYGBgCgpUaGlzIHZlcnNpb24gb2YgRmlzaEdsb2IgbGVhdmVzIG91dCBzZWFzb25zIGZvciBHTUVYLCBmaXggaGVyZQoKYGBge3IgYWRkIHNlYXNvbiB0byBHTUVYfQojYWRkIHNlYXNvbiB0byBHTUVYIHRvIHN1cnZleSB1bml0CgpGaXNoR2xvYl8xLjVbc3VydmV5ID09ICJHTUVYIiwgc3VydmV5X3VuaXQgOj0gcGFzdGUwKHN1cnZleSwiLSIsc2Vhc29uKV0KYGBgCgpBbHNvIGFkZGluZyBpbiBzZWFzb25zIGZvciBOSUdGUwoKYGBge3IgYWRkIHNlYXNvbiB0byBOSUdGU30KI2FkZCBzZWFzb24gdG8gR01FWCB0byBzdXJ2ZXkgdW5pdAoKRmlzaEdsb2JfMS41W3N1cnZleSA9PSAiTklHRlMiLCBzdXJ2ZXlfdW5pdCA6PSBwYXN0ZTAoc3VydmV5LCItIixxdWFydGVyKV0KYGBgCgpBbHNvIGFkZCBzZWFzb25zIGZvciBOb3ItQlRTCmBgYHtyIGFkZCBzZWFzb24gdG8gIE5vci1CVFN9CkZpc2hHbG9iXzEuNVtzdXJ2ZXkgPT0gIk5vci1CVFMiICYgbW9udGggJWluJSBjKDE6NiksIHN1cnZleV91bml0IDo9ICJOb3ItQlRTLTEiXVtzdXJ2ZXkgPT0gIk5vci1CVFMiICYgbW9udGggJWluJSBjKDc6MTIpLCBzdXJ2ZXlfdW5pdCA6PSAiTm9yLUJUUy0zIl0KYGBgCgpaQUYgKFNvdXRoIEFmcmljYSkgaGFzIGRpc3RpbmN0IEF0bGFudGljIGFuZCBJbmRpYW4gc3VydmV5cyAoc3BsaXQgIGF0IH4yMC4wMcuaIEUsIENhcGUgQWd1bGhhcykKCmBgYHtyIGFkZCBsb25naXR1ZGluYWwgcmVnaW9uIHRvIFpBRn0KRmlzaEdsb2JfMS41W3N1cnZleSA9PSAiWkFGIiAmIGxvbmdpdHVkZSA8MjAuMDEsIHN1cnZleV91bml0IDo9ICJaQUYtQVRMIl1bc3VydmV5ID09ICJaQUYiICYgbG9uZ2l0dWRlID49IDIwLjAxLCBzdXJ2ZXlfdW5pdCA6PSAiWkFGLUlORCJdCmBgYAoKUmVnaW9uIG5hbWVzCmBgYHtyfQpzb3J0KHVuaXF1ZShGaXNoR2xvYl8xLjVbLHN1cnZleV91bml0XSkpCmBgYAojI0RhdGEgUmVwbGFjZW1lbnRzCiMjIyNHcmVlbmxhbmQgKHZlcnNpb24gaW4gRmlzaEdsb2IgMS41IGlzIG1pc3NpbmcgbGVuZ3RocyBhbmQgdGhlcmVmb3JlIGJpb21hc3MgdmFsdWVzKQpUaGlzIHZlcnNpb24gd2FzIG9idGFpbmVkIGRpcmVjdGx5IGZyb20gS2FybC1NaWNoYWVsIFdlcm5lciBba2FybC1taWNoYWVsLndlcm5lckB0aHVlbmVuLmRlXShrYXJsLW1pY2hhZWwud2VybmVyQHRodWVuZW4uZGUpIHdobyBub3cgbWFuYWdlcyB0aGUgR3JlZW5sYW5kIHN1cnZleSBTZXB0ZW1iZXIgMjAyMy4gSGUgaXMgYmFzZWQgaW4gR2VybWFueS4KCmBgYHtyfQpncmVlbmxhbmQgPC0gCgpgYGAKCiMjIyNOb3J3YXkKUHJlcHBlZCBieSBMYXVyZW5lIFBlY3VjaGV0IChVIFRyw7Ztc28sIE5vcndheSkgU2VwdGVtYmVyIDIwMjMgdG8gcmVwbGFjZSB3aGF0J3MgaW4gRmlzaEdsb2IgMS41IGJlY2F1c2UgSU1SICJhcmUgcXVpdGUgY29uY2VybmVkIHRoYXQgRmlzaEdsb2IsIGFuZCBvdGhlciBzdHVkaWVzLCBoYXZlIGJlZW4gdXNpbmcgYSAiZmxhd2VkIiBtdWx0aS1zdXJ2ZXlzIGRhdGFzZXQgdGhhdCBpcyBhdmFpbGFibGUgaW4gTk1EQyAoZGF0YSBwb3J0YWwgb2YgSU1SKS4gVHVybnMgb3V0IHRoYXQgdGhpcyBkYXRhc2V0IHdhcyBwdXQgcHVibGljbHkgYnkgbWlzY29tbXVuaWNhdGlvbiBvbiBOTURDIGFmdGVyIG9uZSBwdWJsaXNoZWQgcGFwZXIgaW4gU2NpZW50aWZpYyBSZXBvcnRzLCBhbmQgSSB0aGluayB0aGV5IG9ubHkgcmVhbGl6ZWQgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIGRhdGFzZXQganVzdCB0aGUgbGFzdCB5ZWFyIGFzIHNvbWUgcGFwZXJzIGFyZSBjb21pbmcgb3V0IHVzaW5nIGl0IChlc3BlY2lhbGx5IHRoZSBvbmUgZnJvbSBDZXNjIEdvcmRvLVZpbGFzZWNhIGluIFBOQVMgaHR0cHM6Ly93d3cucG5hcy5vcmcvZG9pLzEwLjEwNzMvcG5hcy4yMTIwODY5MTIwKS4gVGhleSBhcmUgbm93IHRyeWluZyB0byBtYWtlIHNvbWUgZGFtYWdlIGNvbnRyb2xzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZGF0YXNldCBpcyBub3QgdXNlZCBldmVyIGFnYWluIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IGNsZWFuZGVkIGFuZCBzdGFuZGFyZGlzZWQgZGF0YXNldHMgb2YgdGhlIEJhcmVudHMgU2VhIHN1cnZleSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUgaW4gTk1EQyBhcmUgdXNlZCBpbnN0ZWFkIG9mLgoKU2VwdGVtYmVyIDE0OiBGcm9tIExhdXJlbmUsICJJIHNlbmQgeW91IGluIGF0dGFjaG1lbnQgdGhlIOKAnG5ld+KAnSBJTVIgc3VydmV5IGZvcm1hdHRlZCBmb3IgRmlzaGdsb2IuIEkgaGF2ZSBkb25lIHNvbWUgc21hbGwgY2hlY2sgb2YgdGhlIGRhdGFzZXQsIGFuZCBzbyBmYXIgZXZlcnl0aGluZyBsb29rcyBnb29kLCBidXQgSSBkaWRu4oCZdCBkbyBhIGRlZXAgY2hlY2sgeWV0LCBidXQgSSBkb27igJl0IHNlZSB3aHkgdGhlcmUgc2hvdWxkIGJlIGFueSBwcm9ibGVtcyB3aXRoIGl0Li4uLkZvciB5b3VyIHN0dWR5LCBJIHRoaW5rIGl0IGlzIGFsc28gaW1wb3J0YW50IHRoYXQgeW91IGtub3cgdGhhdCB0aGVyZSBoYXMgYmVlbiBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0YXhvbm9taWMgZGVzY3JpcHRpb25zIGluIHRoZSBCYXJlbnRzIFNlYSBzbyB0aGF0IHNvbWUgc3BlY2llcyBzaG91bGQgYmUgY29uc2lkZXJlZCBhdCB0aGUgZ2VudXMgbGV2ZWwgaW5zdGVhZCBvZiBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2lzLCBJIHNlbmQgeW91IGluIGF0dGFjaCBhbiBleGNlbCAoQmFyZW50cyBTZWEgRmlzaCBSZWZlcmVuY2UgTGlzdC5jc3YpIGZpbGUgdGhhdCBzdW1tYXJpemUgd2hpY2ggc3BlY2llcyBtaWdodCBiZSBhIG1pc2lkZW50aWZpY2F0aW9uIGFuZCB3aGljaCBvbmUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW5kIG1lcmdlZC4iIEFsbCBvZiB0aGVzZSBmaWxlcyBub3cgbGl2ZSBpbiAiZGF0YS9Ob3J3YXlfU2VwMjAyMyIKCkdpdmVuIEJhcmVudHMgU2VhIEZpc2ggUmVmZXJlbmNlIExpc3QuY3N2LCB0aGVyZSBhcmUgc29tZSByYXJlIHNwZWNpZXMgdGhhdCBzaG91bGQgb25seSBiZSB0cnVzdGVkIGFzIGEgdHJ1ZSBJRCBpZiB0aGVyZSBhcmUgcGFydGljdWxhciBwZW9wbGUgb24gdGhlIGJvYXQuIEZvciBjb25zaXN0ZW5jeSwgdGhlc2Ugc3BlY2llcyB3aWxsIGJlIHJlbW92ZWQuIERlc3BpdGUgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiwgdGhlc2Ugc3BlY2llcyB3aWxsIGJlIG1haW50YWluZWQuCi1DdXJyZW50IGRpc2FncmVlbWVudCBhYm91dCB3aGV0aGVyIEx5Y29kZXMgcm9zc2kgYW5kIEx5Y29kZXMgcmV0aWN1bGF0dXMgYXJlIGRpZmZlcmVudCBvciBzYW1lLCB3aWxsIGtlZXAgc2VwYXJhdGUgZm9yIG5vdy4KLVNwZWNpbWVucyBvZiBBbmFyaGljaGFzIGxlc3MgdGhhbiAxMGNtIGFyZSBvZnRlbiBtaXNpZGVudGlmaWVkLCBidXQgd2Ugd2lsbCBzdGlsbCBrZWVwIHRocmVlIGRpc3RpbmN0IHNwZWNpZXMKCmBgYHtyfQpiYXJlbnRzX3NlYV9zcHBfZml4IDwtIGZyZWFkKGhlcmU6OmhlcmUoImRhdGEiLCJOb3J3YXlfU2VwMjAyMyIsIkJhcmVudHMgU2VhIEZpc2ggUmVmZXJlbmNlIExpc3QuY3N2IikpCgojcmVkdWNlIHRvIE9HIGlkZW50aWZpY2F0aW9uIGFuZCBmaXhlZCBpZGVudGlmaWNhdGlvbiBjb2x1bW4gCmJhcmVudHNfc2VhX3NwcF9maXggPC0gYmFyZW50c19zZWFfc3BwX2ZpeFssLihOZXdWYWx1ZSwgU2NpZW50aWZpYyldIAoKI2xvYWQgTm9yd2VnaWFuIGRhdGEKbG9hZChoZXJlOjpoZXJlKCJkYXRhIiwiTm9yd2F5X1NlcDIwMjMiLCJOT1ItQlRTX2NsZWFuLlJEYXRhIikpCm5vcndheV9jbGVhbiA8LSBkYXRhLnRhYmxlKGRhdGEpCnJtKHJlYWRtZSkKbG9hZChoZXJlOjpoZXJlKCJkYXRhIiwiTm9yd2F5X1NlcDIwMjMiLCJOT1ItQlRTX3N0ZF9jbGVhbi5SRGF0YSIpKSAjaW5jbHVkZXMgZmlzaGdsb2IgZmxhZ2dpbmcgd2hpY2ggSSB3aWxsIG5vdCB1c2UKbm9yd2F5X2NsZWFuX3N0ZCA8LSBkYXRhLnRhYmxlKGRhdGEpCnJtKHJlYWRtZSkKcm0oZGF0YSkKCiN0byBmaXggbmFtaW5nLCBsaW5rIHNwZWNpZXMgbmFtZXMgaW4gZGF0YSB0byBzcGVjaWVzIG5hbWVzIGluIGJhcmVudHMgc2VhIHNwcCBmaXgKbm9yd2F5X2NsZWFuX3NwcCA8LSB1bmlxdWUobm9yd2F5X2NsZWFuWywuKGFjY2VwdGVkX25hbWUsIHZlcmJhdGltX25hbWUpXSkKCm5vcndheV9jbGVhbl9zcHBbLFNjaWVudGlmaWMgOj0gdmVyYmF0aW1fbmFtZV0KCiNtZXJnZSB3aXRoIHNwcCBrZXkgZnJvbSBsYXVyZW5lCm5vcndheV9jbGVhbl9zcHAgPC0gbm9yd2F5X2NsZWFuX3NwcFtiYXJlbnRzX3NlYV9zcHBfZml4LCBvbiA9ICJTY2llbnRpZmljIl0KClZpZXcobm9yd2F5X2NsZWFuX3NwcFtTY2llbnRpZmljID09IHZlcmJhdGltX25hbWVdKQoKI3NwZWNpZmljIHNwcCBmaXgKbm9yd2F5X2NsZWFuW2ZhbWlseSA9PSAiTXljdG9waGlkYWUiLCBdCmBgYAoKCkRlbGV0ZSBHcmVlbmxhbmQgYW5kIE5vcndheQpgYGB7cn0KRmlzaEdsb2JfMS41IDwtIEZpc2hHbG9iXzEuNVshKHN1cnZleSAlaW4lIGMoIk5vci1CVFMiLCAiR1JMLURFIikpXQpgYGAKCgpBZGQgaW4gdXBkYXRlZCBHcmVlbmxhbmQgYW5kIE5vcndheSBkYXRhCmBgYHtyfQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsbm9yd2F5KQpGaXNoR2xvYl8xLjUgPC1yYmluZChGaXNoR2xvYl8xLjUsZ3JlZW5sYW5kKQpgYGAKCgojI1ByZWxpbWluYXJ5IERhdGEgQ3V0cwojIyNTcGVjaWZpYyBSZWdpb25hbCBDaGFuZ2VzIEJlZm9yZSBDdXR0aW5nIHRvIDEwIHllYXJzIG9ubHkKCipHU0wqCi0gTm9ydGg6IHdlIGhhdmUgZGF0YSAxOTgwLTIwMTksIGJ1dCBnZWFyIGNoYW5nZXMgaW4gMjAwNC8yMDA1LCBzbyBsZXQncyB1c2UgbGF0ZXIgcG9ydGlvbiAobW9yZSBjb25zaXN0ZW50IG1vbnRocyBvZiBzYW1wbGluZzsgMjAwNS0yMDE5OyAxNSB5ZWFycykgCi0gU291dGg6IHdlIGhhdmUgZGF0YSAxOTcwLTIwMTksIGJ1dCBnZWFyL3Zlc3NlbCBjaGFuZ2VzIGluIDE5ODUgYW5kIGFnYWluIGluIDE5OTIsIHNvIGFnYWluIGxldCdzIHVzZSBsYXRlciBwb3J0aW9uICgxOTkyLTIwMTk7IDI3IHllYXJzKQotIFNlZSBbdGhpcyBnaXRodWIgaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9BcXVhQXVtYS9maXNoZ2xvYi9pc3N1ZXMvNzIpCgpgYGB7ciBHU0wgZml4ZXN9CiNpZGVudGlmeSBoYXVsX2lkcyBvZiBoYXVscyB3ZSBzaG91bGQgcmVtb3ZlIGZyb20gR1NMIHN1cnZleXMKaGF1bF9pZHNfdG9fcmVtb3ZlX0dTTCA8LSB1bmlxdWUoRmlzaEdsb2JfMS41WyhzdXJ2ZXkgPT0gIkdTTC1OIiAmIHllYXIgPCAyMDA1KXwoc3VydmV5ID09ICJHU0wtUyIgJiB5ZWFyIDwgMTk5MiksaGF1bF9pZF0pCgpGaXNoR2xvYl8xLjUgPC0gRmlzaEdsb2JfMS41WyEoaGF1bF9pZCAlaW4lIGhhdWxfaWRzX3RvX3JlbW92ZV9HU0wpLF0gI3JlbW92ZSBoYXVscyBiZWZvcmUgY29uc2lzdGVudCBnZWFyL3Zlc3NlbCB3YXMgdXNlZApgYGAKCipOb3ItQlRTKiAgCi0gT3ZlcmxhcCBiZXR3ZWVuIElCVFMgYW5kIE5vci1CVFMgc3VydmV5cyBiZWxvdyA2MsuabGF0aXR1ZGUsIHNvIGRlbGV0ZSBhbGwgaGF1bHMgdGhhdCBvY2N1ciBiZWxvdyA2MsuabGF0aXR1ZGUKYGBge3J9CiNpZGVudGlmeSBoYXVsX2lkcyBvZiBoYXVscyB3ZSBzaG91bGQgcmVtb3ZlIGZyb20gTm9yLUJUUyBzdXJ2ZXlzCmhhdWxfaWRzX3RvX3JlbW92ZV9Ob3JfQlRTIDwtIHVuaXF1ZShGaXNoR2xvYl8xLjVbKHN1cnZleSA9PSAiTm9yLUJUUyIgJiBsYXRpdHVkZSAgPCA2MiksaGF1bF9pZF0pCgpGaXNoR2xvYl8xLjUgPC0gRmlzaEdsb2JfMS41WyEoaGF1bF9pZCAlaW4lIGhhdWxfaWRzX3RvX3JlbW92ZV9Ob3JfQlRTKSxdICNyZW1vdmUgaGF1bHMgYmVmb3JlIGNvbnNpc3RlbnQgZ2Vhci92ZXNzZWwgd2FzIHVzZWQKYGBgCgoqU0dFT1JHKgotIEZyb20gTWFydGluIENvbGxpbnMsICJNb3N0IHN1cnZleXMgd2VyZSBmb2N1c3NlZCBvbiBkZW1lcnNhbCBmaXNoIG9uIHRoZSBTb3V0aCBHZW9yZ2lhIHNoZWxmICg8IDM1MCBtKSwgYnV0IHN1cnZleXMgaW4gMjAwMywgMjAxMCBhbmQgMjAxOSBoYWQgc29tZSBkZWVwZXIgdHJhd2xzLiAgVGhlIGRlZXBlciB0cmF3bHMgY2F1Z2h0IHZlcnkgZGlmZmVyZW50IGZpc2gsIHNvIGFyZSB1bmxpa2VseSB0byBiZSBvZiB1c2UgdG8gYSBsb25nLXRlcm0gYW5hbHlzaXMsIGJ1dCBJIGhhdmUgbGVmdCB0aGVtIGluLiIKCi1EZWxldGUgYWxsIHRyYXdscyBiZWxvdyAzNTAgTQpgYGB7cn0KCmBgYAoKCiMjI0JlY2F1c2UgdGltZSBpcyBhbiBlc3NlbnRpYWwgY29tcG9uZW50IG9mIHRoZXNlIGFuYWx5c2VzLCB3ZSB3aWxsIGdldCByaWQgb2YgYW55IHN1cnZleSB4IHNlYXNvbiBjb21iaW5hdGlvbnMgdGhhdCBhcmUgbm90IHNhbXBsZWQgZm9yIGF0IGxlYXN0IDEwIHllYXJzCgpgYGB7ciBzdW1tYXJ5IGJ5IHN1cnZleSByZWdpb259CiNuZXcgcm93IGZvciB0b3RhbCBudW1iZXIgb2YgeWVhcnMgc2FtcGxlZApGaXNoR2xvYl8xLjVbLHllYXJzX3NhbXBsZWQgOj0gbGVuZ3RoKHVuaXF1ZSh5ZWFyKSksLihzdXJ2ZXlfdW5pdCldCgpzdW1tYXJ5KEZpc2hHbG9iXzEuNSR5ZWFyc19zYW1wbGVkKSAjcmFuZ2VzIGZyb20gMiAoREZPIFN0cmFpZ2h0IG9mIEdlb3JnaWEpIHRvIDU3IChOb3J0aGVhc3QgVVMpCgojc3RhdGlzdGljcyBhYm91dCBmdWxsIGRhdGFzZXQKbnJvdyhGaXNoR2xvYl8xLjUpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5XSkpIApsZW5ndGgodW5pcXVlKEZpc2hHbG9iXzEuNVssc3VydmV5X3VuaXRdKSkgCgojcmVtb3ZlIG9ic2VydmF0aW9ucyBmb3IgYW55IHJlZ2lvbnMgeCBzZWFzb24gY29tYmluYXRpb25zIHNhbXBsZWQgbGVzcyB0aGFuIDEwIHRpbWVzCkZpc2hHbG9iLjEweWVhciA8LSBGaXNoR2xvYl8xLjVbeWVhcnNfc2FtcGxlZCA+PSAxMCxdCgojc3RhdGlzdGljcyBhYm91dCByZWR1Y2VkIDEwIHllYXIgZGF0YXNldApucm93KEZpc2hHbG9iLjEweWVhcikgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxzdXJ2ZXldKSkgCmxlbmd0aCh1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyWyxhcy5jaGFyYWN0ZXIoc3VydmV5X3VuaXQpXSkpIAoKI3JlbW92ZSBmdWxsIGRhdGFiYXNlCnJtKEZpc2hHbG9iXzEuNSkKCgpgYGAKCiMjI0ZvciB0YXhvbm9taWMgYW5hbHlzZXMsIHJlc29sdXRpb24gdG8gc3BlY2llcyBpcyByZXF1aXJlZC4gVGhlcmVmb3JlLCB3ZSB3aWxsICBleGNsdWRlIGFueSBvYnNlcnZhdGlvbnMgbm90IHJlc29sdmVkIHRvIHNwZWNpZXMuIAoKYGBge3Igc3BwIElEIG9ubHl9CkZpc2hHbG9iLjEweWVhci5zcHAgPC0gRmlzaEdsb2IuMTB5ZWFyW3JhbmsgJWluJSBjKCJTcGVjaWVzIiwgIlN1YnNwZWNpZXMiKSxdICM0MDc3NzMwIHRvdGFsIG9ic2VydmF0aW9ucwoKI3JlbW92ZSBmdWxsIHNwZWNpZXMgZGF0YWJhc2UKcm0oRmlzaEdsb2IuMTB5ZWFyKQoKI3ZlY3RvciB3aXRoIGFsbCBzdXJ2ZXkgbmFtZXMKYWxsX3N1cnZleV91bml0cyA8LSBzb3J0KHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWyxzdXJ2ZXlfdW5pdF0pKQoKI2NhbGN1bGF0ZSAjIHNwZWNpZXMgcGVyIHllYXIKRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssLihzdXJ2ZXlfdW5pdCwgeWVhciwgYWNjZXB0ZWRfbmFtZSldKQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhclssc3BwX2NvdW50X3N1cnZleV95ZWFyIDo9IHVuaXF1ZU4oYWNjZXB0ZWRfbmFtZSksLihzdXJ2ZXlfdW5pdCwgeWVhcildCgpGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnIgPC11bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhclssLihzdXJ2ZXlfdW5pdCwgIHllYXIsIHNwcF9jb3VudF9zdXJ2ZXlfeWVhcildKQoKbnJvdyhGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnIpCgojY2FsY3VsYXRlICMgaGF1bHMgcGVyIHllYXIKRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhciA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcFssLihzdXJ2ZXlfdW5pdCwgeWVhciwgaGF1bF9pZCldKQoKRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhclssaGF1bGlkX2NvdW50X3N1cnZleV95ZWFyIDo9IHVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXlfdW5pdCwgeWVhcildCgpGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnIgPC11bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhclssLihzdXJ2ZXlfdW5pdCwgIHllYXIsIGhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcildKQoKbnJvdyhGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnIpCgpgYGAKCgojI1Zpc3VhbGx5IEluc3BlY3QgRGlzdHJpYnV0aW9uIG9mIERhdGEgVGhyb3VnaCBUaW1lIGFuZCBTcGFjZQoKIyNTcGF0aWFsIGFuZCBUZW1wb3JhbCBQYXR0ZXJucyBpbiBBbGwgVHJhd2wgU3VydmV5cwoKTGV0J3MgbG9vayBhdCB0aGUgbnVtYmVyIG9mIGhhdWxzIHBlciB5ZWFyL21vbnRoIGFuZCB5ZWFyL3F1YXJ0ZXIgYW5kIHllYXIvc2Vhc29uIHZpc3VhbGx5CgpgYGB7ciBoYXVscyBwZXIgeWVhciwgbW9udGgsIHF1YXJ0ZXJ9CiN1bmlxdWUgc3VydmV5LCBzdXJ2ZXlfdW5pdCwgeWVhciwgbW9udGgsIHF1YXJ0ZXIsIHNlYXNvbiwgaGF1bF9pZCwgbGF0LCBsb24KRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIuc3BwWywuKHN1cnZleSwgc3VydmV5X3VuaXQsIHllYXIsbW9udGgscXVhcnRlcixzZWFzb24saGF1bF9pZCwgbGF0aXR1ZGUsIGxvbmdpdHVkZSxoYXVsX2R1cildKQoKI2FkZCBjb2x1bW4gd2l0aCBhZGp1c3RlZCBsb25naXR1ZGUgZm9yIGZldyBzdXJ2ZXlzIHRoYXQgY3Jvc3MgZGF0ZWxpbmUgKE5aLUNIQVQgYW5kIEFJKQpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbLGxvbmdpdHVkZV9hZGogOj0gaWZlbHNlKChzdXJ2ZXlfdW5pdCAlaW4lIGMoIkFJIiwiTlotQ0hBVCIpICYgbG9uZ2l0dWRlID4gMCksbG9uZ2l0dWRlLTM2MCxsb25naXR1ZGUpXQoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzWyxoYXVsX2NvdW50c19wZXJfc3VydmV5X3NlYXNvbl9tb250aCA6PXVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXksIG1vbnRoLCBzZWFzb24pXVssICNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXksIHNlYXNvbiwgYW5kIG1vbnRoCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfY291bnRzX3Blcl9zdXJ2ZXlfcXVhcnRlcl9tb250aCA6PXVuaXF1ZU4oaGF1bF9pZCksLihzdXJ2ZXksIG1vbnRoLCBxdWFydGVyKV1bLCNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXksIG1vbnRoLCBhbmQgcXVhcnRlcgogICAgICAgICAgICAgICAgICAgICB0b3RhbF9oYXVsc19zdXJ2ZXkgOj11bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5KV1bLCNjb3VudCAjIGhhdWxzIHBlciBzdXJ2ZXkgaW4gYWxsIHllYXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5LCBzZWFzb24sIGFuZCBtb250aCBkaXZpZGVkIGJ5IHRvdGFsICMgb3ZlciBhbGwgeWVhcnMKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24gOj1oYXVsX2NvdW50c19wZXJfc3VydmV5X3NlYXNvbl9tb250aC90b3RhbF9oYXVsc19zdXJ2ZXldWywKICAgICAgICAgICAgICAjcHJvcG9ydGlvbiBvZiBoYXVscyBmb3IgZWFjaCBzdXJ2ZXksIHF1YXJ0ZXIsIGFuZCBtb250aCBkaXZpZGVkIGJ5IHRvdGFsICMgb3ZlciBhbGwgeWVhcnMKICAgICAgICAgICAgICAgICAgICAgaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyIDo9aGF1bF9jb3VudHNfcGVyX3N1cnZleV9xdWFydGVyX21vbnRoL3RvdGFsX2hhdWxzX3N1cnZleV1bLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfbW9udGggOj11bmlxdWVOKGhhdWxfaWQpLC4oeWVhciwgc3VydmV5X3VuaXQsIG1vbnRoKV1bLCAjY291bnQgIyBoYXVscyBwZXIgc3VydmV5IHVuaXQsIHllYXIsIGFuZCBtb250aAogICAgICAgICAgICAgICAgICAgICB0b3RhbF9oYXVsc19zdXJ2ZXlfeWVhciA6PSB1bmlxdWVOKGhhdWxfaWQpLC4oc3VydmV5X3VuaXQseWVhcildWywgI2NvdW50IHRvdGFsICMgaGF1bHMgcGVyIHN1cnZleSB1bml0IGFuZCB5ZWFyCiAgICAgICAgICAgICAgICAgICAgICNwcm9wb3J0aW9uIG9mIGhhdWxzIGZvciBlYWNoIHN1cnZleSB1bml0IGFuZCBtb250aCBkaXZpZGVkIGJ5IHRvdGFsICMgaGF1bHMgd2l0aGluIGEgc3VydmV5IHVuaXQgd2l0aGluIGEgeWVhcgogICAgICAgICAgICAgICAgICAgICBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5IDo9IGhhdWxfY291bnRfcGVyX3N1cnZleV95ZWFyX21vbnRoL3RvdGFsX2hhdWxzX3N1cnZleV95ZWFyXVssIAoKICAgICAgICAgICAgICAgICAgICAgaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfcXVhcnRlciA6PXVuaXF1ZU4oaGF1bF9pZCksLih5ZWFyLCBzdXJ2ZXlfdW5pdCwgcXVhcnRlcildWywgI2NvdW50ICMgaGF1bHMgcGVyIHN1cnZleSB1bml0LCB5ZWFyLCBhbmQgbW9udGgKICAgICAgICAgICAgICAgICAgICAgI3Byb3BvcnRpb24gb2YgaGF1bHMgZm9yIGVhY2ggc3VydmV5IHVuaXQgYW5kIG1vbnRoIGRpdmlkZWQgYnkgdG90YWwgIyBoYXVscyB3aXRoaW4gYSBzdXJ2ZXkgdW5pdCB3aXRoaW4gYSB5ZWFyCiAgICAgICAgICAgICAgICAgICAgIGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSA6PSBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9xdWFydGVyL3RvdGFsX2hhdWxzX3N1cnZleV95ZWFyXSAKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb24gPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssLihzdXJ2ZXksIHN1cnZleV91bml0LCBtb250aCwgc2Vhc29uLCBoYXVsX2NvdW50c19wZXJfc3VydmV5X3NlYXNvbl9tb250aCx0b3RhbF9oYXVsc19zdXJ2ZXksIGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBzZWFzb24gYWNyb3NzIGFsbCB5ZWFycwoKRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssLihzdXJ2ZXksc3VydmV5X3VuaXQgLCBtb250aCwgcXVhcnRlciwgaGF1bF9jb3VudHNfcGVyX3N1cnZleV9xdWFydGVyX21vbnRoLHRvdGFsX2hhdWxzX3N1cnZleSwgaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKV0pICNyZWxhdGl2ZSBzYW1wbGluZyBieSBxdWFydGVyIGFjcm9zcyBhbGwgeWVhcnMKCkZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGggPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssLihzdXJ2ZXksIHllYXIsIHN1cnZleV91bml0LCBtb250aCwgaGF1bF9jb3VudF9wZXJfc3VydmV5X3llYXJfbW9udGgsdG90YWxfaGF1bHNfc3VydmV5X3llYXIsaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSldKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgbW9udGggd2l0aGluIHllYXJzCgpGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXIgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1ssLihzdXJ2ZXksIHllYXIsIHN1cnZleV91bml0LCBxdWFydGVyLCBoYXVsX2NvdW50X3Blcl9zdXJ2ZXlfeWVhcl9xdWFydGVyLHRvdGFsX2hhdWxzX3N1cnZleV95ZWFyLGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSldKSAjcmVsYXRpdmUgc2FtcGxpbmcgYnkgbW9udGggd2l0aGluIHllYXJzCgojaG93IGRvZXMgI2hhdWxzIHZhcnkgd2l0aCBzZWFzb24gYW5kIG1vbnRoPwpzdXJ2ZXlfc2Vhc29uX21vbnRoX2hhdWxzIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoc3VydmV5X3NlYXNvbl9tb250aF9oYXVscywgZmlsZW5hbWUgPSAic3VydmV5X3NlYXNvbl9tb250aF9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDUsIHdpZHRoID0gMTUsIHVuaXRzID0gImluIikKCiNob3cgZG9lcyAjaGF1bHMgdmFyeSB3aXRoIHF1YXJ0ZXIgYW5kIG1vbnRoPwpzdXJ2ZXlfcXVhcnRlcl9tb250aF9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXIpICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXksc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZShzdXJ2ZXlfcXVhcnRlcl9tb250aF9oYXVscywgZmlsZW5hbWUgPSAic3VydmV5X3F1YXJ0ZXJfbW9udGhfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA1LCB3aWR0aCA9IDE1LCB1bml0cyA9ICJpbiIpCgojaG93IGRvZXMgI2hhdWxzIHZhcnkgd2l0aCB5ZWFyIGFuZCBtb250aD8KeWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMgPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGgpICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5X3VuaXQsc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdnc2F2ZSh5ZWFyX3N1cnZleV9tb250aF9oYXVscywgZmlsZW5hbWUgPSAieWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDE2LCB1bml0cyA9ICJpbiIpCmdnc2F2ZSh5ZWFyX3N1cnZleV9tb250aF9oYXVscywgZmlsZW5hbWUgPSAieWVhcl9zdXJ2ZXlfbW9udGhfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDE2LCB1bml0cyA9ICJpbiIpCgojaG93IGRvZXMgI2hhdWxzIHZhcnkgd2l0aCB5ZWFyIGFuZCBtb250aD8KeWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscyA8LSBnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIGZhY2V0X3dyYXAofnN1cnZleV91bml0LHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUoeWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscywgZmlsZW5hbWUgPSAieWVhcl9zdXJ2ZXlfcXVhcnRlcl9oYXVscy5wZGYiLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTYsIHVuaXRzID0gImluIikKZ2dzYXZlKHllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMsIGZpbGVuYW1lID0gInllYXJfc3VydmV5X3F1YXJ0ZXJfaGF1bHMucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDE2LCB1bml0cyA9ICJpbiIpCmBgYAoKTm93LCBsZXQncyBsb29rIGF0IGhvdyBsb2NhdGlvbiBvZiBzYW1wbGluZyB2YXJpZXMgYnkgbW9udGggb2Ygc2FtcGxpbmcgYW5kIHllYXIgb2Ygc2FtcGxpbmcgCgpgYGB7ciBsb2NhdGlvbiBieSB5ZWFyIHBsb3RzfQpsb2NhdGlvbl9ieV95ZWFyIDwtIGdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMpICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgZmFjZXRfd3JhcCh+c3VydmV5X3VuaXQsIHNjYWxlcyA9ICJmcmVlIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X3llYXIsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X3llYXIucGRmIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCgpnZ3NhdmUobG9jYXRpb25fYnlfeWVhciwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfeWVhci5qcGciLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV95ZWFyLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV95ZWFyLmVwcyIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQpgYGAKCgpgYGB7ciBsb2NhdGlvbiBieSBtb250aCBwbG90c30KbG9jYXRpb25fYnlfbW9udGggPC0gZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscykgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICBmYWNldF93cmFwKH5zdXJ2ZXlfdW5pdCwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3NhdmUobG9jYXRpb25fYnlfbW9udGgsIGZpbGVuYW1lID0gImxvY2F0aW9uX2J5X21vbnRoLnBkZiIscGF0aCA9IGhlcmU6OmhlcmUoImZpZ3VyZXMiLCJ2aWV3X2RhdGEiKSwgaGVpZ2h0ID0gOCwgd2lkdGggPSAxMiwgdW5pdHMgPSAiaW4iKQoKZ2dzYXZlKGxvY2F0aW9uX2J5X21vbnRoLCBmaWxlbmFtZSA9ICJsb2NhdGlvbl9ieV9tb250aC5qcGciLHBhdGggPSBoZXJlOjpoZXJlKCJmaWd1cmVzIiwidmlld19kYXRhIiksIGhlaWdodCA9IDgsIHdpZHRoID0gMTIsIHVuaXRzID0gImluIikKCmdnc2F2ZShsb2NhdGlvbl9ieV9tb250aCwgZmlsZW5hbWUgPSAibG9jYXRpb25fYnlfbW9udGguZXBzIixwYXRoID0gaGVyZTo6aGVyZSgiZmlndXJlcyIsInZpZXdfZGF0YSIpLCBoZWlnaHQgPSA4LCB3aWR0aCA9IDEyLCB1bml0cyA9ICJpbiIpCmBgYAoKCiMjUmVnaW9uIFNwZWNpZmljIERhdGEgUHJvY2Vzc2luZwoKLUZyZWRzdG9uIGV0IGFsLiAyMDIyIGFuZCBCYXR0IGV0IGFsLiAyMDE3IGluZm9ybWVkIE5vcnRoIEFtZXJpY2FuIGRhdGEgcHJvY2Vzc2luZwotUGVyc29uYWwgY29tbXVuaWNhdGlvbiB3aXRoIEF1cm9yZSBNYXVyZWF1ZCByZTogd29yayBieSBMLiBQZWN1Y2hldCBhbmQgUi4gRnJlbGF0IGFuZCB0aGUgc3VwcGxlbWVudGFyeSBtYXRlcmlhbCBmb3IgTWF1cmVhdWQgZXQgYWwuIDIwMTkgaW5mb3JtZWQgRXVyb3BlYW4gZGF0YSBwcm9jZXNzaW5nCi1BZGRpdGlvbmFsIGRhdGEgcHJvY2Vzc2luZyBpbmZvcm1lZCBieSBkYXRhIGl0c2VsZiwgYW5kIGJ5IEZpc2hHbG9iIHBkZiBzdW1tYXJ5IGRvY3VtZW50cwotbGltaXQgdG8gbWF4IDMgbW9udGhzIGZvciBlYWNoIHN1cnZleSB1bml0LCByZXByZXNlbnRhdGl2ZSBvZiBhICdzZWFzb24nCgojIyMjIkFJIgpgYGB7ciBBSSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleSA9PSAiQUkiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXkgPT0gIkFJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQUkiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkFJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLSBNb3N0IGhhdWxzIGluIDYsNyw4Ci0gU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi0gTm8gZHJhbWF0aWMgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgCmBgYHtyIEFJIHByb2Nlc3Npbmd9CmFpX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQUkiICYgbW9udGggJWluJSBjKDY6OCksaGF1bF9pZF0pCmBgYAoKCiMjIyNCSVRTCihXZSBoYXZlIHR3byBzdXJ2ZXlzIGZvciBCSVRTLCBxdWFydGVyIDEgYW5kIHF1YXJ0ZXIgNCkKQklUUyAxCgpGcm9tIEZyZWRzdG9uIGV0IGFsLiAyMDIzLCBldmVyeSB5ZWFyIGFmdGVyIDIwMDAgaGFzID40MDAgaGF1bHMgYW5kIG1vc3Qgb2YgdGhlIGVhcmxpZXIgeWVhcnMgYXJlIDw1MCAKCmBgYHtyICBCSVRTMSB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAotS2VlcCBib3RoIG1vbnRocyAoMiwzKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1Db25zaXN0ZW50ICMgb2Ygc3BlY2llcyBhbmQgIyBoYXVscyBhZnRlciAyMDAwCmBgYHtyIEJJVFMxIHByb2Nlc3Npbmd9CmJpdHMxX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy0xIiAmIG1vbnRoICVpbiUgYygyLDMpICYgeWVhciA+IDIwMDAsaGF1bF9pZF0pCmBgYAoKQklUUzQKYGBge3IgIEJJVFM0IHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJCSVRTLTQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkJJVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotS2VlcCAoMTAsMTEsMTIpCi1TdGFydCBpbiAyMDAwIChzdGFydHMgaW4gMTk5NiwgYnV0IGdhcCBpbiAxOTk3IGFuZCAxOTk4LCBhbmQgMTk5NiBhbGwgaW4gRGVjZW1iZXI7IGFsc28gc3BwIHJpY2huZXNzIGluIGZpcnN0IHN1cnZleSB2ZXJ5IGxvdzsgY29uc2lzdGVudCAjIG9mIGhhdWxzIGFmdGVyIDIwMDApCi1TZWVtaW5nbHkgY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKCmBgYHtyIEJJVFM0IHByb2Nlc3Npbmd9CmJpdHM0X2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQklUUy00IiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyID4gMjAwMCxoYXVsX2lkXSkKYGBgCgoKIyMjI0NITCAoQ2hpbGUpCgpgYGB7ciAgQ0hMIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkNITCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJDSEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJDSEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkNITCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCi1LZWVwICg3LDgsOSkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBDSEwgcHJvY2Vzc2luZ30KY2hsX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiQ0hMIiAmIG1vbnRoICVpbiUgYyg3OjkpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0RGTy1ORgoKCmBgYHtyICBERk8tTkYgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkRGTy1ORiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiREZPLU5GIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiBzcHAgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBtYWpvciBjaGFuZ2VzIGluIGhhdWxpZCB0aHJvdWdoIHRpbWUKCmBgYHtyIERGTy1ORiBwcm9jZXNzaW5nfQpkZm9fbmZfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tTkYiICYgbW9udGggJWluJSBjKDEwOjEyKSxoYXVsX2lkXSkKYGBgCgoKIyMjI0RGTy1RQ1MKCmBgYHtyICBERk8tUUNTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiREZPLVFDUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkRGTy1RQ1MiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJERk8tUUNTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKLUtlZXAgKDcsOCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTm8gbWFqb3IgY2hhbmdlcyBpbiByaWNobmVzcyBvdmVyIHRpbWUKLU5vIG1ham9yIGNoYW5nZXMgaW4gI2hhdWxzCgpgYGB7ciBERk8tUUNTIHByb2Nlc3Npbmd9CmRmb19xY3NfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJERk8tUUNTIiAmIG1vbnRoICVpbiUgYyg3LDgpLGhhdWxfaWRdKQpgYGAKCgoKIyMjI0VCUwoKLVNhbXBsaW5nIHllYXJzIHByaW9yIHRvIDE5ODQgKGRhdGEgYmVnaW4gaW4gMTk4Mikgd2VyZSBleGNsdWRlZCBmcm9tIGFuYWx5c2lzIGR1ZSB0byBsYXJnZSBhcHBhcmVudCBpbmNyZWFzZXMgaW4gdGhlIG51bWJlciBvZiBzcGVjaWVzIHJlY29yZGVkIGluIHRoZSBmaXJzdCB0d28geWVhcnMuIChCYXR0IGV0IGFsLiAyMDE3KQoKYGBge3IgIEVCUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJFQlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRUJTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJFQlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKLUtlZXAgKDYsNyw4KQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1QZXIgQmF0dCBldCBhbC4gMjAxNywgbGltaXQgdG8gPj0gMTk4NAotTm8gY2xlYXIgY2hhbmdlcyAgaW4gcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1ObyBjbGVhciBjaGFuZ2VzIGluICMgaGF1bHMgdGhyb3VnaCB0aW1lCgpgYGB7ciBFQlMgcHJvY2Vzc2luZ30KZWJzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRUJTIiAmIG1vbnRoICVpbiUgYyg2LDcsOCkgJiB5ZWFyID49IDE5ODQsaGF1bF9pZF0pCmBgYAoKCiMjIyNFVkhPRQoKYGBge3IgIEVWSE9FIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkVWSE9FIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJFVkhPRSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwICgxMCwxMSwxMikKLVNlZW1pbmdseSBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotVmVyeSBsb3cgc2FtcGxpbmcgaW4gMjAxNyAoYW5kIGFsc28gbG93IHJpY2huZXNzKSwgZXhjbHVkZSB0aGlzIHllYXIKCmBgYHtyIEVWSE9FIHByb2Nlc3Npbmd9CmV2aG9lX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRVZIT0UiICYgbW9udGggJWluJSBjKDEwLDExLDEyKSAmIHllYXIgIT0gMjAxNyAsaGF1bF9pZF0pCmBgYAoKCiMjIyNGQUxLIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIEZBTEsgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJGQUxLIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRkFMSyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkZBTEsiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKLUtlZXAgRmVicnVhcnkgKDIpIG9ubHkgZnJvbSAyMDA0IG9ud2FyZCAobW9zdCBjb25zaXN0ZW50IHNhbXBsaW5nKQotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBuZXh0IHN0ZXAgd2l0aCBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbgoKCmBgYHtyIEZBTEsgcHJvY2Vzc2luZ30KZmFsa19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZBTEsiICYgbW9udGggJWluJSBjKDIpICYgeWVhciA+PSAyMDA0LCBoYXVsX2lkXSkKYGBgCgoKIyMjI0ZSLUNHRlMKCmBgYHtyICBGUi1DR0ZTIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkZSLUNHRlMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJGUi1DR0ZTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCi1LZWVwIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLVNlZWVtaW5nbHkgY29uc2lzdGVudCAjaGF1bHMgdGhyb3VnaCB0aW1lCgoKYGBge3IgRlItQ0dGUyBwcm9jZXNzaW5nfQpmcl9jZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiRlItQ0dGUyIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNHSU4gKGV4Y2x1ZGVkIGZyb20gZmluYWwgZGF0YXNldCkKCmBgYHtyICBHSU4gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdJTiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR0lOIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotRXhjbHVkZSB0aGlzIHJlZ2lvbiwgbm8gY29uc2lzdGVudCBzYW1wbGluZyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdJTiBwcm9jZXNzaW5nfQpnaW5faGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI0dNRVgKLUluIHRoZSBHdWxmIG9mIE1leGljbywgd2UgcmVzdHJpY3RlZCBvdXIgYW5hbHlzaXMgdG8gZGF0YSBmcm9tIDE5ODQgLSAyMDAwIChmdWxsIHJhbmdlICAxOTgyLTIwMTQpOyBpZiBhbGwgeWVhcnMgaGFkIGJlZW4gdXNlZCwgdGhlIG51bWJlciBvZiBzaXRlcyBzYW1wbGVkIGluIGF0IGxlYXN0IDg1JSBvZiB5ZWFycyAgd291bGQgZHJvcCBmcm9tIDM5IHRvIDEzLiAoQmF0dCBldCBhbC4gMjAxNykKCkdNRVggRmFsbCAKYGBge3IgIEdNRVggRmFsbCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDksMTAsMTEKLUluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUsIHdpbGwgcmVzdHJpY3QgdG8gPC04Ny41IGxvbmdpdHVkZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQoKCmBgYHtyIEdNRVgtRmFsbCBwcm9jZXNzaW5nfQpnbWV4X2ZhbGxfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLUZhbGwiICYgbW9udGggJWluJSBjKDksMTAsMTEpICYgbG9uZ2l0dWRlX2FkaiA8IC04Ny41LCBoYXVsX2lkXSkKYGBgCgpHTUVYIFN1bW1lcgpgYGB7ciAgR01FWCBTdW1tZXIgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdNRVgtU3VtbWVyIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJHTUVYLVN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDUsNiw3Ci1JbiBjb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHRoaXMgd2lsbCBiZSBmaXhlZCBpbiBzcGF0aWFsIHN0YW5kYXJkaXphdGlvbiBzdGVwCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcyBiZWZvcmUgMjAwOCBhbmQgMjAwOCBvbndhcmQgdGhyb3VnaCB0aW1lCi1TZWVlbWluZ2x5IGNvbnNpc3RlbnQgI2hhdWxzIHRocm91Z2ggdGltZQotSnVtcCBmcm9tIDIwMDcgdG8gMjAwOCwgd2hlbiBzcGF0aWFsIGZvb3RwcmludCBpbmNyZWFzZXMsIHNvIEkgd2lsbCBvbmx5IHVzZSBkYXRhIGZyb20gYmVmb3JlIDIwMDgKCmBgYHtyIEdNRVgtU3VtbWVyIHByb2Nlc3Npbmd9CmdtZXhfc3VtbWVyX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiR01FWC1TdW1tZXIiICYgbW9udGggJWluJSBjKDUsNiw3KSAmIHllYXIgPDIwMDgsIGhhdWxfaWRdKQpgYGAKCiMjIyNHT0EKYGBge3IgR09BIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIkdPQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJHT0EiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdPQSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUtlZXAgbW9udGhzIDYsNyw4Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50ICNoYXVscyB0aHJvdWdoIHRpbWUKCmBgYHtyIEdPQSBwcm9jZXNzaW5nfQpnb2FfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHT0EiICYgbW9udGggJWluJSBjKDYsNyw4KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0dSTC1ERQotRnJvbSBCZXVraG9mIGV0IGFsLiAyMDE5LCBhbGwgc3VydmV5cyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlcgpgYGB7ciBHUkwtREUgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1JMLURFIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotTm8gbW9udGhzIGluIGRhdGEgc2V0LCBidXQgYWNjb3JkaW5nIHRvIEJldWtob2YgZXQgYWwuIDIwMTksIGFsbCBzYW1wbGluZyBpbiBPY3RvYmVyIGFuZCBOb3ZlbWJlciBzbyBrZWVwIGFsbCAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotIyBvZiBoYXVscyBkcm9wcyBiZXR3ZWVuIDE5OTEgYW5kIDE5OTIsIGFuZCBib3RoIDE5OTIgYW5kIDIwMTcgc28gbGltaXQgdG8geWVhcnMgYmV0d2VlbiAoMTk5My0yMDE2KQoKYGBge3IgR1JMLURFIHByb2Nlc3Npbmd9CmdybF9kZV9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdSTC1ERSIgJiB5ZWFyICVpbiUgYygxOTkzOjIwMTYpLCBoYXVsX2lkXSkKYGBgCgojIyMjR1NMCgpHU0wtTgpgYGB7ciBHU0wtTiB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLU4iLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1OIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA2LDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi0jIG9mIGhhdWxzIGluIDIwMDUgaXMgaGlnaGVyLCBzbyBzdGFydCBpbiAyMDA2CgpgYGB7ciBHU0wtTiBwcm9jZXNzaW5nfQpnc2xfbl9oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1OIiAmIHllYXIgPiAyMDA1LCBoYXVsX2lkXSkKYGBgCgpHU0wtUwpgYGB7ciBHU0wtUyB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJHU0wtUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiR1NMLVMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIkdTTC1TIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA4LDksMTAKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBHU0wtUyBwcm9jZXNzaW5nfQpnc2xfc19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIkdTTC1TIiAmIG1vbnRoICVpbiUgYyg4OjEwKSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lDRS1HRlMKCmBgYHtyIElDRS1HRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJQ0UtR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklDRS1HRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgSUNFLUdGUyBwcm9jZXNzaW5nfQppY2VfZ2ZzX2hhdWxzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUNFLUdGUyIgJiBtb250aCAlaW4lIGMoMjo0KSwgaGF1bF9pZF0pCmBgYAoKIyMjI0lFLUlHRlMKCmBgYHtyIElFLUlHRlMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSUUtSUdGUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklFLUlHRlMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDEwLDExLDEyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSBhZnRlciAyMDA0IChzYW1wbGVkIGZhciBlYXN0IGluIDIwMDMgYW5kIDIwMDQpCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgpgYGB7ciBJRS1JR0ZTIHByb2Nlc3Npbmd9CmllX2lnZnNfaGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJRS1JR0ZTIiAmIG1vbnRoICVpbiUgYygxMDoxMikgJiB5ZWFyICA+IDIwMDQsIGhhdWxfaWRdKQpgYGAKCiMjIyNJUy1NT0FHIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIElTLU1PQUcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJJUy1NT0FHIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiSVMtTU9BRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIklTLU1PQUciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyB0b28gc2NhdHRlcmVkIG92ZXIgdGltZSwgZXhjbHVkaW5nCgpgYGB7ciBJUy1NT0FHIHByb2Nlc3Npbmd9CmlzX21vYWdfaGF1bHNfa2VlcCA8LSBOVUxMCmBgYAoKIyMjI01FRElUUwpgYGB7ciBNRURJVFMgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTUVESVRTIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAgYWxsIHN1cnZleXMgaW4gcXVhcnRlciAyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTUVESVRTIHByb2Nlc3Npbmd9Cm1lZGl0c19oYXVsc19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk1FRElUUyIsIGhhdWxfaWRdKQpgYGAKCgojIyMjTVJUIChleGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQpCmBgYHtyIE1SVCB2aXN1YWx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJNUlQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTVJUIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJNUlQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1TYW1wbGluZyBpbmNvbnNpc3RlbnQsIGV4Y2x1ZGUgY29tcGxldGVseQoKYGBge3IgTVJUIHByb2Nlc3Npbmd9Cm1ydF9oYXVsc19rZWVwIDwtIE5VTEwKYGBgCgojIyMjTkFNCgpgYGB7ciBOQU0gdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5BTSIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkFNIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCBzdXJ2ZXlzIGluIDEgYW5kIDIgKG1vc3QgY29uc2lzdGVudGx5IHNhbXBsZWQpCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgZXhjZXB0IGZvciAxOTk4IChleGNsdWRlKQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGV4Y2VwdCBmb3IgMTk5OCAoZXhjbHVkZSkKCmBgYHtyIE5BTSBwcm9jZXNzaW5nfQpuYW1faGF1bHNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOQU0iICYgbW9udGggJWluJSBjKDEsMikgJiB5ZWFyICE9IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTkVVUwoKCk5FVVMgU3ByaW5nCmBgYHtyIE5FVVMtU3ByaW5nIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1TcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDMsNCw1IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAgYmVsb3cKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg3LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4MSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLVNwcmluZyBwcm9jZXNzaW5nfQojY2FsY3VsYXRlIHdndF9jcHVlIChrbV4yIGF2ZyBmcm9tIHNlYW4gTHVjZXkpIGFuZCB3Z3RfaCAoYWxsIGJpb21hc3MgdmFsdWVzIGNhbGlicmF0ZWQgdG8gc3RhbmRhcmQgcHJlIDIwMDkgMzAgbWludXRlIHRvdykKRmlzaEdsb2IuMTB5ZWFyLnNwcFtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfaCA6PSB3Z3QvMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCB3Z3RfY3B1ZSA6PSB3Z3QvMC4wMzg0XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1faCA6PSBudW0vMC41XVtzdXJ2ZXkgPT0gIk5FVVMiLCBudW1fY3B1ZSA6PSBudW0vMC4wMzg0XQoKCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfc3ByaW5nX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1soKHN1cnZleV91bml0ID09ICJORVVTLVNwcmluZyIgJiBtb250aCAlaW4lIGMoMzo1KSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtU3ByaW5nIiAmIG1vbnRoICVpbiUgYygzOjUpICYgeWVhciA+PSAyMDA5ICYgKGhhdWxfZHVyID4gMC4yNSAgJiBoYXVsX2R1ciA8IDAuNDIpKSksIGhhdWxfaWRdKQoKCmBgYAoKTkVVUyBGYWxsCgpgYGB7ciBORVVTLUZhbGwgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCA5LDEwLDExIG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAgYmVsb3cKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzIChlc3BlY2lhbGx5IGFmdGVyIDg0LCBzaG91bGQgYmUgZml4ZWQgd2l0aCBzdGFuZGFyZGl6YXRpb24gc3RlcCkKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyAoZXNwZWNpYWxseSBhZnRlciA4NSwgc2hvdWxkIGJlIGZpeGVkIHdpdGggc3RhbmRhcmRpemF0aW9uIHN0ZXApCgpgYGB7ciBORVVTLUZhbGwgcHJvY2Vzc2luZ30KCiNhbHNvLCBmb3Igbm9ydGhlYXN0LCB3ZSBhcmUgZ29pbmcgdG8gZGVsZXRlIGFueSBoYXVscyBiZWZvcmUgMjAwOSB0aGF0IGFyZSBvdXRzaWRlIG9mICsvLSA1IG1pbnV0ZXMgb2YgMzAgbWludXRlcyBhbmQgMjAwOSBmb3J3YXJkIHRoYXQgYXJlIG91dHNpZGUgb2YgKy8tIDUgbWludXRlcyBvZiAyMCBtaW51dGVzCm5ldXNfZmFsbF9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbKChzdXJ2ZXlfdW5pdCA9PSAiTkVVUy1GYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgPCAyMDA5ICYgKGhhdWxfZHVyID4gMC40MiAmIGhhdWxfZHVyIDwgMC41OCkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VydmV5X3VuaXQgPT0gIk5FVVMtRmFsbCIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSkgJiB5ZWFyID49IDIwMDkgJiAoaGF1bF9kdXIgPiAwLjI1ICAmIGhhdWxfZHVyIDwgMC40MikpKSwgaGF1bF9pZF0pCmBgYAoKIyMjI05JR0ZTCk5vcnRoZXJuIElyZWxhbmQKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBzcHJpbmcgdmlzdWFsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOSUdGUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1LZWVwIDIsMyw0IG1vbnRocwotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAgYmVsb3cKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCmBgYHtyIE5JR0ZTIDEgcHJvY2Vzc2luZ30KbmlnZnNfMV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTEiICYgbW9udGggJWluJSBjKDIsMyw0KSwgaGF1bF9pZF0pCmBgYAoKClNwcmluZyBOb3J0aGVybiBJcmVsYW5kIChxdWFydGVyIDEpCgpgYGB7ciBOSUdGUyBmYWxsIHZpc3VhbH0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5JR0ZTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOSUdGUy00IixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotS2VlcCAxMCwxMSBtb250aHMKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcCBiZWxvdwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscwoKYGBge3IgTklHRlMgNCBwcm9jZXNzaW5nfQpuaWdmc180X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTklHRlMtNCIgJiBtb250aCAlaW4lIGMoMTAsMTEpLCBoYXVsX2lkXSkKYGBgCgojIyMjTm9yLUJUUwoKRmlyc3QgaGFsZiBvZiB5ZWFyICgxOjYpLCBFeGNsdWRlZCBmcm9tIGZpbmFsIGRhdGFzZXQKTm9yLUJUUy0xCmBgYHtyIE5vci1CVFMtMX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiJm1vbnRoLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiJm1vbnRoLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMSIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSAxOjMgbW9udGhzCi1Tb21ld2hhdCBpbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lIChub3J0aGVybiBzaXRlcyBzYW1wbGVkIGxhdGVyKSwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gc3RhbmRhcmRpemF0aW9uIHN0ZXAgYmVsb3cKLUxhdXJlbmUgUGVjdWNoZXQgKFUgVHJvbXNvKSB0b2xkIHVzIHRoYXQgb25seSBzdXJ2ZXlzIDIwMDQgYW5kIG9ud2FyZHMgd29yayBmb3IgYmlvZGl2ZXJzaXR5IGFuYWx5c2VzCi1Gcm9tIDIwMDQsIGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzIGV4Y2VwdCBmb3IgMjAxMyB3aGljaCB3ZSB3aWxsIGV4Y2x1ZGUKCgpgYGB7ciBOb3ItQlRTLTEgcHJvY2Vzc2luZ30Kbm9yX2J0c18xX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0xIiAmIG1vbnRoICVpbiUgYygxOjMpICYgeWVhciA+PSAyMDA0ICYgeWVhciAhPSAyMDEzLCBoYXVsX2lkXSkKYGBgCgoKU2Vjb25kIGhhbGYgb2YgeWVhciAoMjoxMikKTm9yLUJUUy0zCmBgYHtyIE5vci1CVFMtM30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOb3ItQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5vci1CVFMtMyIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgOCw5LDEwCi1Tb21ld2hhdCBpbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgc2hvdWxkIGJlIGNhdWdodCBpbiBzdGFuZGFyZGl6YXRpb24gc3RlcCBiZWxvdwotTnVtYmVyIG9mIGhhdWxzIGlzIHZhcmlhYmxlLCBidXQgbm8gY2xlYXIgeWVhcnMgdG8gZXhjbHVkZQotTGF1cmVuZSBQZWN1Y2hldCAoVSBUcm9tc28pIHRvbGQgdXMgdGhhdCBvbmx5IHN1cnZleXMgMjAwNCBhbmQgb253YXJkcyB3b3JrIGZvciBiaW9kaXZlcnNpdHkgYW5hbHlzZXMKCgpgYGB7ciBOb3ItQlRTLTMgcHJvY2Vzc2luZ30Kbm9yX2J0c18zX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTm9yLUJUUy0zIiAmIG1vbnRoICVpbiUgYyg4OjEwKSAmIHllYXIgPj0gMjAwNCwgaGF1bF9pZF0pCmBgYAoKIyMjI05TLUlCVFMKCk5TLUlCVFMtMQpgYGB7ciBOUy1JQlRTLTF9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0xIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEsMiwzCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotTGluZWFyIGluY3JlYXNlIGluIHJpY2huZXNzLCBjdXRvZmYgb24gIyBoYXVscyBtb3JlIGNsZWFyCi1MaW5lYXIgaW5jcmVhc2UsIGJ1dCBzb21ld2hhdCBjbGVhciBicmVhayBiZXR3ZWVuIGxhdGUgNzBzIGFuZCBtaWQtODBzLCBvbmx5IGtlZXAgaGF1bHMgYWZ0ZXIgMTk4NAoKCmBgYHtyIE5TLUlCVFMtMSBwcm9jZXNzaW5nfQpuc19pYnRzXzFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTEiICYgbW9udGggJWluJSBjKDE6MykgJiB5ZWFyID49IDE5ODQsIGhhdWxfaWRdKQpgYGAKCk5TLUlCVFMtMwpgYGB7ciBOUy1JQlRTLTN9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlMtSUJUUy0zIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDcsOCw5Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotQ29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLUVhcmx5IHllYXJzIGxvd2VyICMgaGF1bHMsIHdpbGwgc3RhcnQgYXQgMTk5OAoKCmBgYHtyIE5TLUlCVFMtMyBwcm9jZXNzaW5nfQpuc19pYnRzXzNfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOUy1JQlRTLTMiICYgbW9udGggJWluJSBjKDc6OSkgJiB5ZWFyID49IDE5OTgsIGhhdWxfaWRdKQpgYGAKCgojIyMjTloKCk5aLUNIQVQKCmBgYHtyIE5aLUNIQVR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUNIQVQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1DSEFUIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTIsMSwyIChOT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIExVTVAgMSBhbmQgMiB3aXRoIHByZXZpb3VzIHllYXIpCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MKLVNlZW1pbmdseSBjb25zaXN0ZW50IG51bWJlciBvZiBoYXVscyBhZnRlciAxOTk1CgoKYGBge3IgTlotQ0hBVCBwcm9jZXNzaW5nfQpuel9jaGF0X2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotQ0hBVCIgJiBtb250aCAlaW4lIGMoMTIsMSwyKSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKTlotRUNTSQoKYGBge3IgTlotRUNTSX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotRUNTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1FQ1NJIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA0LDUsNgotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKLUdhcCBiZXR3ZWVuIDE5OTUgYW5kIDIwMDUsIGJ1dCB3ZSBoYXZlIDEwIHRvdGFsIHllYXJzIHNvIHdlJ2xsIGtlZXAgZm9yIG5vdwoKCmBgYHtyIE5aLUVDU0kgcHJvY2Vzc2luZ30KbnpfZWNzaV9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLUVDU0kiICYgbW9udGggJWluJSBjKDQsNSw2KSwgaGF1bF9pZF0pCmBgYAoKTlotU1VCQQoKYGBge3IgTlotU1VCQX0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIk5aLVNVQkEiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJOWi1TVUJBIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxMSBhbmQgMTIKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotRmFyIG1vcmUgaGF1bHMgaW4gMTk5MHMsIHRoZXNlIGVhcmx5IHNhbXBsaW5nIHllYXJzIHdpbGwgYmUgZXhjbHVkZWQgKHN0YXJ0IGluIDIwMDApCgoKYGBge3IgTlotU1VCQSBwcm9jZXNzaW5nfQpuel9zdWJhX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotU1VCQSIgJiBtb250aCAlaW4lIGMoMTEsMTIpICYgeWVhciA+PSAyMDAwLCBoYXVsX2lkXSkKYGBgCgpOWi1XQ1NJCgpgYGB7ciBOWi1XQ1NJfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJOWi1XQ1NJIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIk5aLVdDU0kiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDMsNAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1MaW5lYXIgZGVjcmVhc2UgaW4gIyBvZiBoYXVscyB0aHJvdWdoIHRpbWUsIGxlYXZlIG91dCBmaXJzdCB0d28geWVhcnMgd2l0aCBoaWdoZXN0ICMgaGF1bHMgKD49IDE5OTUpCgoKYGBge3IgTlotV0NTSSBwcm9jZXNzaW5nfQpuel93Y3NpX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiTlotV0NTSSIgJiBtb250aCAlaW4lIGMoMyw0KSAmIHllYXIgPj0gMTk5NSwgaGF1bF9pZF0pCmBgYAoKIyMjI1BULUlCVFMKUFQtSUJUUwpgYGB7ciBQVC1JQlRTfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJQVC1JQlRTIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlBULUlCVFMiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDksMTAsMTEKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotU2VlbWluZ2x5IGNvbnNpc3RlbnQgbnVtYmVyIG9mIGhhdWxzCgoKYGBge3IgUFQtSUJUUyBwcm9jZXNzaW5nfQpwdF9pYnRzX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUFQtSUJUUyIgJiBtb250aCAlaW4lIGMoOSwxMCwxMSksIGhhdWxfaWRdKQpgYGAKCiMjIyNST0NLQUxMCgpgYGB7ciBST0NLQUxMfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJST0NLQUxMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUk9DS0FMTCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlJPQ0tBTEwiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDgsOQotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVNlZW1pbmdseSBjb25zaXN0ZW50IHJpY2huZXNzCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMKCgpgYGB7ciBST0NLQUxMIHByb2Nlc3Npbmd9CnJvY2thbGxfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJST0NLQUxMIiAmIG1vbnRoICVpbiUgYyg4LDkpLCBoYXVsX2lkXSkKYGBgCgojIyMjUy1HRU9SRwoKYGBge3IgUy1HRU9SR30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiUy1HRU9SRyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTLUdFT1JHIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAxIGFuZCAyCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotU2VlbWluZ2x5IGNvbnNpc3RlbnQgcmljaG5lc3MgZXhjZXB0IGZvciAyMDAzLCB3aWxsIGJlIGV4Y2x1ZGVkCi1TZWVtaW5nbHkgY29uc2lzdGVudCBudW1iZXIgb2YgaGF1bHMsIGV4Y2VwdCBmb3IgMjAxMiwgd2lsbCBiZSBleGNsdWRlZAoKCmBgYHtyIFNHZW9yZ2UgcHJvY2Vzc2luZ30Kc19nZW9yZ19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlMtR0VPUkciICYgbW9udGggJWluJSBjKDEsMikgJiAhKHllYXIgJWluJSBjKDIwMDMsMjAxMikpLCBoYXVsX2lkXSkKYGBgCgojIyMjU0NTCgpTcHJpbmcKYGBge3IgU0NTLVNQUklOR30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNQUklORyIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJTQ1MtU1BSSU5HIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyAyLDMsNAotSW5jb25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZSAobm9ydGhlcm4gbGF0aXR1ZGVzIG9ubHkgc2FtcGxlZCBpbiBlYXJseSB5ZWFycyksIG9ubHkgaW5jbHVkZSBsb25naXR1ZGVzIDwgLTYyIGFuZCBsYXRpdHVkZXMgPCA0NS41Ci1TZWVtaW5nbHkgY29uc2lzdGVudCByaWNobmVzcwotTnVtYmVyIG9mIGhhdWxzIGlzIHZhcmlhYmxlLCBleGNsdWRlIHN1cGVyIGxvdyBhbmQgaGlnaCBudW1iZXJzICgxOTg1LDE5OTQsMjAxNSwyMDE5KQoKCmBgYHtyIHNjc19zcHJpbmcgcHJvY2Vzc2luZ30Kc2NzX3NwcmluZ19rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TUFJJTkciICYgbW9udGggJWluJSBjKDIsMyw0KSAmICEoeWVhciAlaW4lIGMoMTk4NSwxOTk0LDIwMTUsMjAxOSkpICYgbG9uZ2l0dWRlX2FkaiA8IC02MiAmIGxhdGl0dWRlIDwgNDUuNSwgaGF1bF9pZF0pCmBgYAoKU1VNTUVSCmBgYHtyIFNDUy1TVU1NRVJ9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNDUy1TVU1NRVIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0NTLVNVTU1FUiIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgNiw3LDgKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBpbmNyZWFzZXMgbGluZWFybHksIG5vdCBhIGNsZWFyIGJyZWFrIHBvaW50LCB1c2luZyBicmVha3BvaW50IGZyb20gIyBvZiBoYXVscywgYnV0IHdpbGwgZXhjbHVkZSAyMDEwIHdoaWNoIGhhcyBhIHZlcnkgaGlnaCByaWNobmVzcwotIyBIYXVscyBpbmNyZWFzZXMgbGluZWFybHkgZnJvbSB+MTIwIGluIDE5NzAgdG8gfjIyMCBpbiAyMDIwLCBub3QgYSBjbGVhciBicmVha3BvaW50LCBidXQgd2lsbCBnbyB3aXRoIDE5ODYgYmVjYXVzZSB0aGVyZSBpcyBhIGp1bXAgYmV0d2VlbiA4NSBhbmQgODYKLUdlYXIgY2hhbmdlIGluIDE5ODMgKEVsbGluZ3NlbiBldCBhbC4gMjAxNSkKCgpgYGB7ciBzY3Nfc3VtbWVyIHByb2Nlc3Npbmd9CnNjc19zdW1tZXJfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTQ1MtU1VNTUVSIiAmIG1vbnRoICVpbiUgYyg2LDcsOCkgJiB5ZWFyID49IDE5ODYgJiB5ZWFyICE9IDIwMTAsIGhhdWxfaWRdKQpgYGAKCgojIyNTRVVTCgoKU3ByaW5nCgpgYGB7ciBTRVVTLXNwcmluZ30KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3ByaW5nIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zcHJpbmciLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDQsNSw2Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotQ29uc2lzdGVudCByaWNobmVzcyB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgbG93IGluIDE5ODkgYW5kIDIwMTgsIHdpbGwgZXhjbHVkZQoKYGBge3Igc2V1c19zcHJpbmcgcHJvY2Vzc2luZ30Kc2V1c19zcHJpbmdfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTRVVTLXNwcmluZyIgJiBtb250aCAlaW4lIGMoNCw1LDYpICYgeWVhciAhPSAxOTg5ICYgeWVhciAhPSAyMDE4LCBoYXVsX2lkXSkKYGBgCgoKU3VtbWVyCgpgYGB7ciBTRVVTLXN1bW1lcn0KZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5zZWFzb25bc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKG1vbnRoKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9tb250aF95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiTW9udGgiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5xdWFydGVyW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IG1vbnRoKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2Ygc3BlY2llcyBwZXIgeWVhcj8/CmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9zdXJ2ZXlfeWVhci5yW3N1cnZleV91bml0ID09ICJTRVVTLXN1bW1lciIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1zdW1tZXIiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDcsOAotQ29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGxvdyBpbiBmaXJzdCB5ZWFyLCBvdGhlcndpc2Ugb2theSwganVzdCBleGNsdWRlIGZpcnN0IHllYXIgKDE5ODkpCgpgYGB7ciBzZXVzX3N1bW1lciBwcm9jZXNzaW5nfQpzZXVzX3N1bW1lcl9rZWVwIDwtIHVuaXF1ZShGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtc3VtbWVyIiAmIG1vbnRoICVpbiUgYyg3LDgpICYgeWVhciAhPSAxOTg5LCBoYXVsX2lkXSkKYGBgCgoKRmFsbAoKYGBge3IgU0VVUy1mYWxsfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3F1YXJ0ZXIpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwubW9udGhbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0geWVhciksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcygpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNFVVMtZmFsbCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIixdLCBhZXMoeCA9IHllYXIsIHk9aGF1bGlkX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKYGBgCgotVXNlIG1vbnRocyA5LDEwLDExCi1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgbG93IGluIGZpcnN0IHllYXIsIG90aGVyd2lzZSBva2F5LCBqdXN0IGV4Y2x1ZGUgZmlyc3QgeWVhciAoMTk4OSkKCgpgYGB7ciBzZXVzX2ZhbGwgcHJvY2Vzc2luZ30Kc2V1c19mYWxsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU0VVUy1mYWxsIiAmIG1vbnRoICVpbiUgYyg5LDEwLDExKSAmIHllYXIgIT0gMTk4OSwgaGF1bF9pZF0pCmBgYAoKCiMjIyNTV0MtSUJUUwoKU2NvdGxhbmQgU2hlbGYgU2VhCgpTV0MtSUJUUyAxCgpgYGB7ciBTV0MtSUJUUy0xfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtMSIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTEiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1Vc2UgbW9udGhzIDEsMiwzCi1Tb21ld2hhdCBpbmNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lLCBidXQgdGhpcyBzaG91bGQgYmUgYWRkcmVzc2VkIGluIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uIHByb2NlZHVyZSAKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lCi0jIEhhdWxzIGNvbnNpc3RlbnQgZXhjZXB0IGxvdyBpbiAxOTk1LCBqdXN0IGV4Y2x1ZGUgMTk5NQoKCgpgYGB7ciBzd2MtaWJ0cy0xIHByb2Nlc3Npbmd9CnN3Y19pYnRzXzFfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy0xIiAmIG1vbnRoICVpbiUgYygxLDIsMykgJiB5ZWFyICE9IDE5OTUsIGhhdWxfaWRdKQpgYGAKClNXQy1JQlRTIDQKCmBgYHtyIFNXQy1JQlRTLTR9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlNXQy1JQlRTLTQiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiU1dDLUlCVFMtNCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLVVzZSBtb250aHMgMTAsMTEsMTIKLVNvbWV3aGF0IGluY29uc2lzdGVudCBzcGF0aWFsIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHRpbWUgKHNvdXRoZXJuIGxhdGl0dWRlcyBvbmx5IHNhbXBsZWQgaW4gZWFybHkgeWVhcnMpLCBidXQgdGhpcyBzaG91bGQgYmUgYWRkcmVzc2VkIGluIHNwYXRpYWwgc3RhbmRhcmRpemF0aW9uIHByb2NlZHVyZSAKLVJpY2huZXNzIGNvbnNpc3RlbnQgdGhyb3VnaCB0aW1lIChlc3BlY2lhbGx5IGFmdGVyIG1pZCA5MHMpCi0jIEhhdWxzIGNvbnNpc3RlbnQgZXhjZXB0IGxvdyBiZWZvcmUgMTk5NSBhbmQgbG93IGluIDIwMTMsIGV4Y2x1ZGUgdGhlc2UKCgpgYGB7ciBzd2MtaWJ0cy00IHByb2Nlc3Npbmd9CnN3Y19pYnRzXzRfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJTV0MtSUJUUy00IiAmIG1vbnRoICVpbiUgYygxMCwxMSwxMikgJiB5ZWFyICE9IDE5OTUgJiB5ZWFyID49IDE5OTUsIGhhdWxfaWRdKQpgYGAKCiMjIyNXQ0FOTgoKCmBgYHtyIFdDQU5OfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHNlYXNvbiksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fc3VydmV5X3NlYXNvbiksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiU2Vhc29uIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9xdWFydGVyX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIldDQU5OIixdLCBhZXMoeCA9IHllYXIsIHk9c3BwX2NvdW50X3N1cnZleV95ZWFyKSkgKwogIGdlb21fY29sKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIGhhdWxzIHBlciB5ZWFyCmdncGxvdChkYXRhID0gRmlzaEdsb2IuMTB5ZWFyLnNwcF9oYXVsaWRfeWVhci5yW3N1cnZleV91bml0ID09ICJXQ0FOTiIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUhlcmUsIG9uZSBleGNlcHRpb24sIHdpbGwgdXNlIGZvdXIgbW9udGhzICg2LDcsOCw5KSBiZWNhdXNlIGFsbCBzYW1wbGVkIGNvbnNpc3RlbnRseSwgYW5kIGxvd2VyIGxhdGl0dWRlIGFyZWFzIHNhbXBsZWQgbGF0ZXIgaW4gdGhlIHN1bW1lciBjb25zaXN0ZW50bHkKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQoKCmBgYHtyIHdjYW5uIHByb2Nlc3Npbmd9CndjYW5uX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiV0NBTk4iICYgbW9udGggJWluJSBjKDY6OSksIGhhdWxfaWRdKQpgYGAKCiMjIyNXQ1RSSQotRXhjbHVkZSBiZWNhdXNlIG9ubHkgMTAgeWVhcnMgYW5kIG92ZXJsYXBzIHNvbWV3aGF0IHdpaXRoIFdDQU5OCgpgYGB7ciB3Y3RyaSBwcm9jZXNzaW5nfQp3Y3RyaV9rZWVwIDwtIE5VTEwKYGBgCgoKIyMjI1pBRgoKQVRMCmBgYHtyIFpBRiBBVEx9CmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuc2Vhc29uW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihzZWFzb24pLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9zZWFzb24pLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiTW9udGgiLCB5ID0gIlNlYXNvbiIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSBmYWN0b3IobW9udGgpLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3N1cnZleV9xdWFydGVyKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJRdWFydGVyIixmaWxsID0gIlByb3BvcnRpb24gb2YgQWxsIFN1cnZleSBIYXVscyBpbiBGaXNoR2xvYiIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLm1vbnRoW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0geWVhciwgeSA9IGZhY3Rvcihtb250aCksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fbW9udGhfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk1vbnRoIixmaWxsID0gIlByb3BvcnRpb24gb2YgQW5udWFsIEhhdWxzIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5hbm51YWwucXVhcnRlcltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IocXVhcnRlciksIGZpbGwgPSBoYXVsX3Byb3BvcnRpb25fcXVhcnRlcl95ZWFybHkpLGNvbG9yID0gIndoaXRlIikgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcygpICsKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHNbc3VydmV5X3VuaXQgPT0gIlpBRi1BVEwiLF0pICsKICBnZW9tX3BvaW50KGFlcyh4ID0gbG9uZ2l0dWRlX2FkaiwgeSA9IGxhdGl0dWRlLCBjb2xvciA9IHllYXIpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtQVRMIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSBtb250aCksIHNpemUgPSAwLjMsIGFscGhhID0gMC41KSArCiAgc2NhbGVfY29sb3JfdmlyaWRpcyhvcHRpb24gPSAicGxhc21hIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyAjIG9mIHNwZWNpZXMgcGVyIHllYXI/PwpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfc3VydmV5X3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSwgYWVzKHggPSB5ZWFyLCB5PXNwcF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBoYXVscyBwZXIgeWVhcgpnZ3Bsb3QoZGF0YSA9IEZpc2hHbG9iLjEweWVhci5zcHBfaGF1bGlkX3llYXIucltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIsXSwgYWVzKHggPSB5ZWFyLCB5PWhhdWxpZF9jb3VudF9zdXJ2ZXlfeWVhcikpICsKICBnZW9tX2NvbCgpICsKICB0aGVtZV9jbGFzc2ljKCkKCmBgYAoKLUluY2x1ZGUgMSwyLDMKLUNvbnNpc3RlbnQgc3BhdGlhbCBkaXN0cmlidXRpb24gdGhyb3VnaCB0aW1lCi1SaWNobmVzcyBjb25zaXN0ZW50IHRocm91Z2ggdGltZQotIyBIYXVscyBjb25zaXN0ZW50IHRocm91Z2ggdGltZSBhZnRlciAxOTkxCgoKYGBge3IgemFmIGF0bCBwcm9jZXNzaW5nfQp6YWZfYXRsX2tlZXAgPC0gdW5pcXVlKEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUFUTCIgJiBtb250aCAlaW4lIGMoMTozKSAmIHllYXIgPj0gMTk5MSwgaGF1bF9pZF0pCmBgYAoKCklORApgYGB7ciBaQUYgSU5EfQpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLnNlYXNvbltzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IGZhY3Rvcihtb250aCksIHkgPSBmYWN0b3Ioc2Vhc29uKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfc2Vhc29uKSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIk1vbnRoIiwgeSA9ICJTZWFzb24iLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbGwgU3VydmV5IEhhdWxzIGluIEZpc2hHbG9iIikgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVscy5xdWFydGVyW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV90aWxlKGFlcyh4ID0gZmFjdG9yKG1vbnRoKSwgeSA9IGZhY3RvcihxdWFydGVyKSwgZmlsbCA9IGhhdWxfcHJvcG9ydGlvbl9zdXJ2ZXlfcXVhcnRlciksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJNb250aCIsIHkgPSAiUXVhcnRlciIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFsbCBTdXJ2ZXkgSGF1bHMgaW4gRmlzaEdsb2IiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzLmFubnVhbC5tb250aFtzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fdGlsZShhZXMoeCA9IHllYXIsIHkgPSBmYWN0b3IobW9udGgpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX21vbnRoX3llYXJseSksY29sb3IgPSAid2hpdGUiKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJNb250aCIsZmlsbCA9ICJQcm9wb3J0aW9uIG9mIEFubnVhbCBIYXVscyIpICsKICB0aGVtZV9jbGFzc2ljKCkKCmdncGxvdChGaXNoR2xvYi4xMHllYXIudW5pcXVlaGF1bHMuYW5udWFsLnF1YXJ0ZXJbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0pICsKICBnZW9tX3RpbGUoYWVzKHggPSB5ZWFyLCB5ID0gZmFjdG9yKHF1YXJ0ZXIpLCBmaWxsID0gaGF1bF9wcm9wb3J0aW9uX3F1YXJ0ZXJfeWVhcmx5KSxjb2xvciA9ICJ3aGl0ZSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlF1YXJ0ZXIiLGZpbGwgPSAiUHJvcG9ydGlvbiBvZiBBbm51YWwgSGF1bHMiKSArCiAgdGhlbWVfY2xhc3NpYygpCgpnZ3Bsb3QoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtSU5EIixdKSArCiAgZ2VvbV9wb2ludChhZXMoeCA9IGxvbmdpdHVkZV9hZGosIHkgPSBsYXRpdHVkZSwgY29sb3IgPSB5ZWFyKSwgc2l6ZSA9IDAuMywgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzKCkgKwogIHRoZW1lX2NsYXNzaWMoKQoKZ2dwbG90KEZpc2hHbG9iLjEweWVhci51bmlxdWVoYXVsc1tzdXJ2ZXlfdW5pdCA9PSAiWkFGLUlORCIsXSkgKwogIGdlb21fcG9pbnQoYWVzKHggPSBsb25naXR1ZGVfYWRqLCB5ID0gbGF0aXR1ZGUsIGNvbG9yID0gbW9udGgpLCBzaXplID0gMC4zLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgIyBvZiBzcGVjaWVzIHBlciB5ZWFyPz8KZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX3N1cnZleV95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0sIGFlcyh4ID0geWVhciwgeT1zcHBfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgojICMgb2YgaGF1bHMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBGaXNoR2xvYi4xMHllYXIuc3BwX2hhdWxpZF95ZWFyLnJbc3VydmV5X3VuaXQgPT0gIlpBRi1JTkQiLF0sIGFlcyh4ID0geWVhciwgeT1oYXVsaWRfY291bnRfc3VydmV5X3llYXIpKSArCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfY2xhc3NpYygpCgpgYGAKCi1JbmNsdWRlIDQsNSw2Ci1Db25zaXN0ZW50IHNwYXRpYWwgZGlzdHJpYnV0aW9uIHRocm91Z2ggdGltZQotUmljaG5lc3MgY29uc2lzdGVudCB0aHJvdWdoIHRpbWUKLSMgSGF1bHMgY29uc2lzdGVudCBiZWZvcmUgMjAwMSwgYW5kIHRoZW4gYWxzbyBpbiAyMDA1IGFuZCAyMDA5LTIwMTAKCgpgYGB7ciB6YWYgaW5kIHByb2Nlc3Npbmd9CnphZl9pbmRfa2VlcCA8LSB1bmlxdWUoRmlzaEdsb2IuMTB5ZWFyLnVuaXF1ZWhhdWxzW3N1cnZleV91bml0ID09ICJaQUYtSU5EIiAmIG1vbnRoICVpbiUgYyg0OjYpICYgeWVhciAlaW4lIGMoMTk4NToyMDAxLDIwMDUsIDIwMDksMjAxMCksIGhhdWxfaWRdKQpgYGAKCgojIyMjQ29tYmluZSBhbGwgbGlzdHMgdGhhdCBoYXZlIF9rZWVwCmBgYHtyIGNvbWJpbmUgbGlzdHN9CiNhbGwgb2JqZWN0cyB3aXRoIF9rZWVwCmxpc3Rfb2JqIDwtIGxzKHBhdHRlcm4gPSAiX2tlZXAiKQoKI2NvbWJpbmUKZmlzaGdsb2JfaGF1bGlkc190b19rZWVwIDwtIHVubGlzdChsYXBwbHkobGlzdF9vYmosIGdldCkpICMyNDA1MjkgaGF1bHMgKFN0YXJ0ZWQgd2l0aCAyOTY4MDApCgpGaXNoR2xvYi4xMHllYXIuc3BwX21hbnVhbGNsZWFuIDwtIEZpc2hHbG9iLjEweWVhci5zcHBbaGF1bF9pZCAlaW4lIGZpc2hnbG9iX2hhdWxpZHNfdG9fa2VlcCxdCgojc2F2ZQpzYXZlUkRTKEZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW4sIGZpbGUgPSBoZXJlOjpoZXJlKCJkYXRhIiwiY2xlYW5lZCIsIkZpc2hHbG9iLjEweWVhci5zcHBfbWFudWFsY2xlYW4ucmRzIikpCgoKYGBgCgoKIyMjI1NvbWUgc3VydmV5cyBzYW1wbGUgdGhyb3VnaCBlbmQgb2YgeWVhciwgZml4IHRoZXNlCi1OT1RFIFRIQVQgVEhJUyBOWi1DSEFUIFNVUlZFWSBDUk9TU0VTIFlFQVIsIFNPIExVTVAgMSBhbmQgMiB3aXRoIHByZXZpb3VzIHllYXIK